Netlogo foreach 嵌套列表

Win*_*ong 0 netlogo

我正在尝试将旧代码移植到最新版本(6.0.1),以下 foreach 循环在 Netlogo 4.1.3 上运行良好,但是当将代码复制并粘贴到版本 6.0.1 时,出现“item 0 ?” 不起作用。它说的是“?” 未定义。该行代码应该检索段内列表的项目

to setup-row [row colour segments]
  foreach segments
  [
      if pycor = row * row-patches-width and
        (pxcor >= col-patches-width * (item 0 ?)) and (pxcor <= col-patches-
         width * (item 1 ?))
          [set pcolor colour
            output-print item 0 ?]
  ]
end
Run Code Online (Sandbox Code Playgroud)

传入的“segments”变量包含以下列表:

  setup-row  4 blue [[-8 -5] [-3 -1] [0 3] [5 9]]
Run Code Online (Sandbox Code Playgroud)

如果代码工作正常,它应该使用 (item 0 ?) 检索 -8,使用 (item 1 ?) 检索 -5,依此类推。我在旧代码中假设的是“?” 是从 [-8 -5] 段中检索到的第一个列表,(项目 0 ?)检索到 -8,(项目 1 ?)检索到 -5。

我试图通读新的用户手册,以找到类似的东西,但无济于事,或者也许我没有找对地方。希望你们中的一些人能给我指出正确的方向。

Luk*_*e C 5

是的,Netlogo 6.0 中对此进行了更改 - 请参阅转换指南页面。有关新foreach语法的更多详细信息,请参阅字典条目。基本上,您不使用?now,而是显式定义要在过程中使用的变量名称foreach。按照上面的列表示例:

to foreach-example

  let ex [ [-8 -5] [-3 -1] [0 3] [5 9] ]

  foreach ex [
    [ xy_coords ] ->
    ask patches with [ pxcor = (item 0 xy_coords) and pycor = ( item 1 xy_coords) ] [
      set pcolor white
    ]
  ]

end
Run Code Online (Sandbox Code Playgroud)

在这里,我明确指出在整个过程中列表项将被称为“xy_coords”。这是一个很好的更改,可以使代码更具可读性,因为您的变量可以具有更有意义的名称。

  • 是的,在 6.0.1 中,当变量是单个变量时,您可以(谢天谢地!)去掉变量名称两边的括号,例如:`foreach ex [ xy_coords -&gt; ... ]`。 (2认同)