在Dyalog APL中考虑以下名称空间脚本:
:Namespace Test
x ← 0
∇ F
##.Test.x ← 1
∇
∇ G; x
x ← 0
F
∇
:EndNamespace
如果先运行 Test.G 然后运行 Test.x ,则输出为零。怎么来的?如何在 Test.F 中设置 Test.x ?
答案 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