2012-04-21 18 views
12

In R programing for those coming from other languages John Cook sagt, dassWas sind die Unterschiede zwischen lexikalischen und statischen Scoping?

R lexikalischen Scoping während S-PLUS statischen Umfang verwendet verwendet. Insbesondere bei Verschlüssen kann der Unterschied subtil sein.

Ich fand diese merkwürdig, weil ich immer lexikalisches Scoping und statisches Scoping dachte, wo auch.

Gibt es unterschiedliche Attribute für lexikalische und statische Scoping, oder ist dies eine Unterscheidung, die sich von Gemeinschaft zu Gemeinschaft, Person zu Person ändert? Wenn ja, was sind die allgemeinen Lager und wie teile ich sie auseinander, damit ich die Bedeutung von jemandem besser verstehen kann, wenn sie diese Wörter benutzt?

+0

Ich vermute, dass sie "dynamisch" statt "lexikalisch" meinten. – Mehrdad

+2

@Mehrdad R ist nicht dynamisch Bereich – efrey

+0

Weird .. neugierig, was sie dann bedeuten. Danke für die Information. – Mehrdad

Antwort

10

Wikipedia (und ich) stimme Ihnen zu, dass die Begriffe "lexikalischer Anwendungsbereich" und "statischer Gültigkeitsbereich" synonym sind. This Lua discussion versucht, eine Unterscheidung zu machen, stellt jedoch fest, dass die Leute nicht zustimmen, was diese Unterscheidung ist. :-)

Es scheint mir, dass die versuchte Unterscheidung mit dem Zugriff auf Namen in einem anderen Funktions-Aktivierungs-Datensatz ("Stack-Block", wenn Sie so wollen) als der aktuellste Ausführungs-Datensatz zu tun hat (? nur) tritt in verschachtelten Funktionen:

function f: 
    var x 
    function h: 
     var y 
     use(y) -- obviously, accesses y in current activation of h 
     use(x) -- the question is, which x does this access? 

mit lexikalischen Gültigkeitsbereich, die Antwort „die Aktivierung von f, die die Aktivierung von h genannt“ und mit Dynamikumfang bedeutet es „die letzte Aktivierung, die jede Variable genannt x "(was möglicherweise nicht f ist). Auf der anderen Seite, wenn die Sprache die Verwendung von x überhaupt verbietet, gibt es keine Frage über "welche x ist dies", da die Antwort "Fehler" ist. :-) Es sieht so aus, als ob einige Leute "statischen Umfang" verwenden, um sich auf diesen dritten Fall zu beziehen.

+1

Also, mit anderen Worten, lexikalisches Scoping ohne Verschluss? – Mehrdad

+2

Ja. Natürlich rate ich (wie der OP) eigentlich, was sie meinen. – torek

+0

Interessant ... +1 cool – Mehrdad

4

R offizielle Dokumentation auch Unterschiede Spielraum zwischen R und S-plus-Adressen:

cube <- function(n) { 
    sq <- function() n*n 
    n*sq() 
} 

Die Ergebnisse von S-Plus: http://cran.r-project.org/doc/manuals/R-intro.html#Scope

Das Beispiel aus dem angegebenen Link kann so vereinfacht werden und R sind unterschiedlich:

## first evaluation in S 
S> cube(2) 
Error in sq(): Object "n" not found 
Dumped 
S> n <- 3 
S> cube(2) 
[1] 18 
## then the same function evaluated in R 
R> cube(2) 
[1] 8 

Ich persönlich denke, die Art der Behandlung von Variablen in R ist natürlicher.

Verwandte Themen