Доступ к переменной сценария пространства имен - PullRequest
1 голос
/ 03 марта 2020

Создайте следующий скрипт пространства имен в Dyalog APL:

:Namespace Test

    x ← 0

    ∇ F
        ##.Test.x ← 1
    ∇

    ∇ G; x
        x ← 0
        F
    ∇          

:EndNamespace

Если я запускаю Test.G , а затем Test.x , я получаю ноль вывода , Как так? Как установить Test.x в Test.F ?

1 Ответ

1 голос
/ 03 марта 2020

Tradfns (традиционные функции, использующие и заголовок и т. Д. c.) Используют dynamici c scoping , что означает, что они "видят" среду того места, откуда они вызваны , (Это в отличие от dfns, которые используют лексическая область видимости ; они видят среду, в которой они были определены.) Подробнее см. документацию .

Теперь, когда G вызывает F, в то время как x локализован в G, глобальный x невидим для F, поскольку локализация в G скрывает глобальное x.

Уведомление что ##.Test. не меняет, в каком пространстве имен мы работаем. x все еще затенен.

Если бы вместо этого вы использовали dfns, вы бы увидели желаемое поведение:

:Namespace Test

    x ← 0

      F←{
          ##.Test.x←1
      }

      G←{
          x←0
          F ⍬
      }

:EndNamespace

Попробуйте онлайн!

...