地图任务中的局部变量?

时间:2015-12-07 19:25:04

标签: netlogo

有没有办法使用map在内联报表任务中定义局部变量?

to go
  show map [? * ?] [1 2 3]
end

按预期显示[1 4 9]。第一组括号中的内容是“记者任务”。

如果我想在任务中使用let该怎么办?

to go
  show map [
             let sq ? * ?
             sq + 1
           ]
           [1 2 3]
end

错误:“此处预计会有记者任务,而不是列表或阻止。”整个第一个括号内的表达式突出显示为产生语法错误的原因。

也许我需要添加task关键字来告诉NetLogo这是一项任务?编程指南说map的“任务原语是可选的”,但值得一试。这有效:

to go
  show map (task [? * ?]) [1 2 3]
end

但这不是:

to go
  show map (task [
                   let sq ? * ?
                   sq + 1
                 ])
           [1 2 3]
end

突出显示sq的第二个实例,并显示错误消息“Expected command”。奇怪的是这次错误是不同的。

也许我需要添加report

to go
  show map (task [
                   let sq ? * ?
                   report sq + 1
                 ])
           [1 2 3]
end

这在语法上是可以接受的,但是当我运行它时,我得到一个运行时错误:“MAP预期输入是一个记者任务,但得到了命令任务(命令任务来自:程序GO)。”

我发现唯一可行的方法是定义一个单独的记者:

to go
  show map square-plus-one [1 2 3]
end

to-report square-plus-one [n]
  let sq n * n
  report sq + 1
end

这很容易。但是,我很好奇是否有一些我遗失的东西。有没有办法在内联报告任务中使用局部变量?

1 个答案:

答案 0 :(得分:1)

目前无法向复杂记者报道任务。请参阅“编程指南”中“Tasks”下的“限制”部分:

  

Reporter任务不能包含命令,只有一个记者表达。

https://github.com/NetLogo/NetLogo/issues/351是相关的 - 它专门讨论了需要从外部范围引用?变量的问题。