Каковы различия между лексическим и статическим охватом?
В R программирование для тех, кто приходит с других языков Джон Кук говорит, что
R использует лексическое охват, а S-PLUS использует статическую область. Разница может быть тонкой, особенно при использовании закрытий.
Я нашел это странным, потому что я всегда считал, что лексическое охват и статическое охват, где синонимичны.
Существуют ли различные атрибуты для лексического и статического охвата, или это различие, которое изменяется от сообщества к сообществу, от человека к человеку? Если да, то какие общие лагеря и как я рассказываю им обособленно, поэтому я могу лучше понять, что имеет смысл, когда они используют эти слова.
Ответы
Ответ 1
Wikipedia (и я) соглашаюсь с вами, что термины "лексическая область" и "статическая область" являются синонимами. Это обсуждение 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
" (которая может не быть be f
). С другой стороны, если язык вообще запрещает использование x
, то нет вопроса о том, "что x
это", поскольку ответ "ошибка".:-) Похоже, что некоторые люди используют "статический охват" для обозначения этого третьего случая.
Ответ 2
В официальной документации 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 различаются:
## 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
Я лично считаю, что способ обработки переменной в R более естественен.