Каковы различия между лексическим и статическим масштабированием?
В R программировании для тех, кто приходит из других языков Джон Кук говорит, что
R использует лексическую область, в то время как S-PLUS использует статическую область. Разница может быть незначительной, особенно при использовании затворов.
Мне это показалось странным, потому что я всегда думал, что лексическая область и статическая область являются синонимами.
Существуют ли различные атрибуты лексической и статической области, или это различие меняется от сообщества к сообществу, от человека к человеку? человек? Если да, то каковы общие лагеря и как я могу отличить их друг от друга, чтобы я мог лучше понять чей-то смысл, когда они используют эти слова.
2 ответа:
Википедия (и я) согласны с вами, что термины "лексический объем" и "статический объем" являются синонимами. Это обсуждение Lua пытается провести различие, но отмечает, что люди не согласны с тем, что такое различие. :- )
Мне кажется, что предпринятое различие связано с доступом к именам в другой записи активации функции ("блок стека", если хотите), чем самая текущая запись выполнения, которая в основном (только?) встречается во вложенных функции:
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?
С лексической областью действия ответом является" активация
f
, которая вызвала активациюh
", а с динамической областью действия это означает" самая последняя активация, имеющая любую переменную с именемx
" (которая может не бытьf
). С другой стороны, если язык вообще запрещает использованиеx
, то нет никакого вопроса о том, "какойx
это", поскольку ответ - "ошибка". :- ) Похоже, что некоторые люди используют "статическую область" для ссылки на этот третий случай.
R официальная документация также рассматривает различия в сфере применения между R и S-plus: http://cran.r-project.org/doc/manuals/R-intro.html#Scope
Пример, приведенный по ссылке, можно упростить следующим образом:
cube <- function(n) { sq <- function() n*n n*sq() }
Результаты S-Plus и R различны:
Я лично думаю, что способ обработки переменной в R более естествен.## 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