访问名称空间脚本变量

时间:2020-03-03 13:43:22

标签: scope scoping apl lexical-scope dyalog

在Dyalog APL中考虑以下名称空间脚本:

:Namespace Test

    x ← 0

    ∇ F
        ##.Test.x ← 1
    ∇

    ∇ G; x
        x ← 0
        F
    ∇          

:EndNamespace

如果先运行 Test.G 然后运行 Test.x ,则输出为零。怎么来的?如何在 Test.F 中设置 Test.x

1 个答案:

答案 0 :(得分:1)

Tradfns(使用和标头的传统函数等)使用dynamic scoping,这意味着它们“看到”了调用它们的地方的环境。 (这与使用lexical scoping的dfns相反;他们看到了定义它们的环境。)有关详细信息,请参见the documentation

现在,当G调用F时,虽然x本地化在G中,但是全局x对于F是不可见的,因为G中的本地化掩盖了全局x

请注意,##.Test.不会更改我们正在使用的命名空间。x仍被遮盖。

如果您曾经使用过dfns,则会看到所需的行为:

:Namespace Test

    x ← 0

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

      G←{
          x←0
          F ⍬
      }

:EndNamespace

Try it online!