有没有办法使用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
这很容易。但是,我很好奇是否有一些我遗失的东西。有没有办法在内联报告任务中使用局部变量?
答案 0 :(得分:1)
目前无法向复杂记者报道任务。请参阅“编程指南”中“Tasks”下的“限制”部分:
Reporter任务不能包含命令,只有一个记者表达。
https://github.com/NetLogo/NetLogo/issues/351是相关的 - 它专门讨论了需要从外部范围引用?
变量的问题。