NetLogo';让我们来问一下你的评价?

NetLogo';让我们来问一下你的评价?,netlogo,Netlogo,以下两行代码的等效性如何 ask agentset [if (attr > 0) [dosomething]] ask agentset with [attr > 0] [dosomething] 是否存在任何预期的(和可解释的)差异 在速度还是内存的使用上? 特别是,在第二种情况下是否将与一起使用 案例导致创建临时代理集, 还是询问。。。使用组合确保 惰性评估?(免责声明:我对编译器的熟悉程度非常肤浅,因此可能遗漏了一些东西。) NetLogo编译器执行的优化(可能已过时)列表

以下两行代码的等效性如何

ask agentset [if (attr > 0) [dosomething]]

ask agentset with [attr > 0] [dosomething]
是否存在任何预期的(和可解释的)差异 在速度还是内存的使用上? 特别是,在第二种情况下是否将
一起使用 案例导致创建临时代理集, 还是<代码>询问。。。使用组合确保 惰性评估?

(免责声明:我对编译器的熟悉程度非常肤浅,因此可能遗漏了一些东西。)

NetLogo编译器执行的优化(可能已过时)列表可在以下位置获得:

这些(在NetLogo 6.0中)的实际代码如下:

就我所知,
ask。。。使用
。它的意思是问。。。with会创建一个中间代理集,因此可能需要比ask更多的内存和时间。。。[如果…]

您应该使用哪一种可能取决于您在效率/可读性权衡方面的立场。(我个人认为,
ask…更具可读性。)

优化
提问是个好主意吗。。。使用
?在我看来,绝对如此。也就是说,在编写编译器时,可能有一个不这样做的技术原因。我只是不知道


确实,有一个很好的理由来解释为什么要问。。。使用
时未进行优化。两种版本之间存在行为差异;这不仅仅是可读性和效率的问题。请参阅布莱恩的答案。

仅进一步阐述尼古拉斯所说的:

问与故意不懒惰。考虑代理在修改其他代理的属性以确定是否应该被请求的代码,可以这样说:

to go
  ask patches with [ pcolor = red ] [
    ask neighbors4 [ set pcolor red ]
  ]
  tick
end
因为
with
创建了一个临时代理集,所以在询问过程中不会更改要询问的代理。这会导致红色区域在反复调用
go
时均匀增长:

现在,用<代码>考虑< < /C> >。< /P>

to go
  ask patches [ 
    if pcolor = red [
      ask neighbors4 [ set color red ]
    ]
  ]
  tick
end
由于尚未询问的面片可能已将其颜色更改为红色,因此红色区域的生长不均匀:


因此,提问与提问实际上有着不同的行为,因此不能对其进行优化。也就是说,正如Nicolas提到的,已经进行了一些类似的优化。

这是非常有意的;见布赖恩的答案。