访问命名空间脚本变量
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
中,全局 x
对 F
不可见因为 G
中的本地化影响了全局 x
.
请注意,##.Test.
不会更改我们正在使用的名称空间。x
仍处于隐藏状态。
如果您改为使用 dfns,您会看到您想要的行为:
:Namespace Test
x ← 0
F←{
##.Test.x←1
}
G←{
x←0
F ⍬
}
:EndNamespace
考虑 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
中,全局 x
对 F
不可见因为 G
中的本地化影响了全局 x
.
请注意,##.Test.
不会更改我们正在使用的名称空间。x
仍处于隐藏状态。
如果您改为使用 dfns,您会看到您想要的行为:
:Namespace Test
x ← 0
F←{
##.Test.x←1
}
G←{
x←0
F ⍬
}
:EndNamespace