gpt4 book ai didi

global-variables - Logo 真的使用动态作用域吗?这与全局变量有何不同?

转载 作者:行者123 更新时间:2023-12-03 03:34:56 29 4
gpt4 key购买 nike

Logo 是我小时候学过的第一种编程语言。我最近发现 Logo 据说使用动态作用域,这让我感到惊讶,因为我一直认为它只是使用全局变量。这让我想知道我是否不明白动态作用域的含义。

认为通过动态作用域,变量将进入全局堆栈,因此当您调用另一个方法时该变量仍然可见。 (到目前为止,就像全局变量一样。)然后,如果您声明了一个具有相同名称的新变量,它将被推送到全局堆栈上,隐藏原始变量。 (此时,与为全局变量分配新值仍然没有太大区别。)最后,当您退出该方法时,新分配将从堆栈中弹出,并且变量将恢复为其原始值。 (这似乎是使其成为动态作用域的关键部分,而不是仅仅重新分配全局变量。)

听说 Logo 使用了动态作用域,我期待这个程序:

to test1
make "x "foo
print (se [In test1: ] :x)
test2
print (se [Back in test1: ] :x)
end

to test2
print (se [In test2: ] :x)
make "x "bar
print (se [Still in test2: ] :x)
end

test1

得到这个输出:

In test1: foo
In test2: foo
Still in test2: bar
Back in test1: foo

但是当我在 FMSLogo 中运行它时,它实际上有以下输出:

In test1: foo
In test2: foo
Still in test2: bar
Back in test1: bar

这实际上符合我小时候的内存,并且与我对名为 x 的单个全局变量的期望一致。但我不明白这是如何动态作用域的——变量永远不会超出作用域!

那么为什么要引用,比如 this one例如,声称 Logo 使用动态范围?

最佳答案

Logo 确实具有动态作用域,但您的示例没有局部变量,因此在 test2 函数中设置的变量是全局变量。您需要使用 local 关键字而不是 make 关键字来创建局部变量。

这应该演示动态范围:

to test1 :x
test2
end

to test2
print (se [In test2: ] :x)
end

make "x "foo
test2
test1 "bar

如果我做对了(自从我写任何 Logo 以来大约有二十年了),它应该产生:

In test2: foo
In test2: bar

调用test2函数直接使用全局变量,但是当从test1调用时,它将使用传递到test1的参数,而不是全局变量。

关于global-variables - Logo 真的使用动态作用域吗?这与全局变量有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22530752/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com