访问命名空间脚本变量

Accessing namespace script variable

考虑 Dyalog APL 中的以下命名空间脚本:

:Namespace Test

    x ← 0

    ∇ F
        ##.Test.x ← 1
    ∇

    ∇ G; x
        x ← 0
        F
    ∇          

:EndNamespace

如果我 运行 Test.G 然后 Test.x,我得到输出零.怎么会?如何在Test.F中设置Test.x?

Tradfns(使用 和 header 等的传统函数)使用 dynamic scoping, which means that they "see" the environment of the place they are called from. (This is in contrast to dfns which use lexical scoping; they see environment in which they were defined.) See the documentation 了解详细信息。

现在,当 G 调用 F 时,而 x 本地化在 G 中,全局 xF 不可见因为 G 中的本地化影响了全局 x.

请注意,##.Test. 不会更改我们正在使用的名称空间。x 仍处于隐藏状态。

如果您改为使用 dfns,您会看到您想要的行为:

:Namespace Test

    x ← 0

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

      G←{
          x←0
          F ⍬
      }

:EndNamespace

Try it online!