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
相同。