NetLogo中自我和我自己的动态范围?
当我运行此代码时:NetLogo中自我和我自己的动态范围?,netlogo,Netlogo,当我运行此代码时: to myself1 create-turtles 1 let a "a" ask turtle 0 [ show a show self ask patch-here [ show a show self show myself ] ] end 我得到这个输出: (turtle 0): "a" (turtle 0): (turtle 0
to myself1
create-turtles 1
let a "a"
ask turtle 0 [
show a
show self
ask patch-here [
show a
show self
show myself
]
]
end
我得到这个输出:
(turtle 0): "a"
(turtle 0): (turtle 0)
(patch 0 0): "a"
(patch 0 0): (patch 0 0)
(patch 0 0): (turtle 0)
因此在ask补丁中code块self
指的是补丁,imf
指的是0
这就是NetLogo用户手册(和示例代码)所引导您的期望
我不清楚为什么self
应该引用补丁而不是turtle0
诚然,我已经很久没有编写Java了,但我的理解是,匿名函数中的这个
指的是嵌入函数的对象。相比之下,上面代码中的self
指的是运行代码的修补程序,而不是在字典中出现self
的海龟。此外,可以从代码块内访问局部变量a
将self
设置为代码块本地的决定,可能是为了提供一种引用正在执行该块的代理的方法,要求NetLogo定义另一种引用调用上下文的方法。正如示例输出所示,这是我自己的功能
更一般地说,imf
似乎指的是调用海龟,即使在单独的函数中使用
to myself2
let a "a"
ask turtle 0 [
show a
show self
ask patch-here [ myself2' ]
]
end
to myself2'
; show a
show self
show myself
end
输出为:
(turtle 0): "a"
(turtle 0): (turtle 0)
(patch 0 0): (patch 0 0)
(patch 0 0): (turtle 0)
因此,imf
可以从一个单独的函数访问,并引用回调用它的海龟。但是变量a
(看起来很相似)是不可访问的。如果未注释掉show a
,NetLogo将发出错误消息,指出myself2'
中未定义a
。(换句话说,NetLogo一般不实现动态范围,即使这些示例似乎表明它对self
和imf
有影响)
所以,对不起,预赛时间太长了。我的问题是关于解释用于self
和imf
但不用于a
等局部变量的准动态范围的最佳方法。公平地说,self
和self
仅仅是特殊情况,还是有更好的方式来讨论它?这是一个很好的问题
self
和imf
所代表的概念在其他编程语言中根本不存在。其他编程语言只是没有“执行此代码的代理”的概念,因为这些语言最初不是基于代理的
在OO语言中,任何与的类比充其量都是遥远的,充其量都是误导性的
self
和self
都是非常有用的定义,如果它们没有出现在语言中,使用它们的定义,您将很难尝试编写各种代码。这是我能给出的关于为什么它们被定义为它们的最好的简短回答:它们是有用的
至于局部变量(如a
)的作用域行为,我认为这是一个单独的问题。您当然可以想象尝试提出某种基于代理的局部变量定义,其中a
类似于临时创建代理变量。我不清楚这样的设计是否可行,甚至是否可取,但无论如何,我们没有这样做,我认为我们甚至没有认真探讨过这种可能性
NetLogo中的局部变量与其他词汇范围语言中的局部变量工作完全相同。他们不参与语言的基于代理的性质。使用self
来指代任何实际“运行”代码的agent1,例如,因为agent1被要求这样做。使用imf
引用要求agent1运行代码的agent2。这个如何?让self
保留其当前含义。让self-1
表示与当前imf
相同的意思,即当前ask
的调用者。让self-2
指向ask
的调用方,该调用方正在运行imf
。让self-3
引用该ask
的调用方等。让self-p
引用运行当前过程的代理。将self-n
引用限制为过程中词汇嵌套的ask
s。也就是说,不能使用self-n
引用当前过程之外的代理。这样一来,它就完全是词汇范围了。为了保持一致性,让self-0
与self
相同。