Подтвердить что ты не робот

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

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

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

Я нашел это странным, потому что я всегда считал, что лексическое охват и статическое охват, где синонимичны.

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

4b9b3361

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