Каковы различия между лексическим и статическим масштабированием?


В R программировании для тех, кто приходит из других языков Джон Кук говорит, что

R использует лексическую область, в то время как S-PLUS использует статическую область. Разница может быть незначительной, особенно при использовании затворов.

Мне это показалось странным, потому что я всегда думал, что лексическая область и статическая область являются синонимами.

Существуют ли различные атрибуты лексической и статической области, или это различие меняется от сообщества к сообществу, от человека к человеку? человек? Если да, то каковы общие лагеря и как я могу отличить их друг от друга, чтобы я мог лучше понять чей-то смысл, когда они используют эти слова.

2 12

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 различны:

 ## 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 более естествен.