在NetLogo中运行具有可变数量参数的任务

时间:2014-02-04 01:09:38

标签: lambda netlogo higher-order-functions

我有一个任务和一个参数列表。我想将任务应用于参数列表。是通过使用字符串而不是任务连接来实现这一目的的唯一方法吗?基本上,我正在寻找其他语言中的apply等价物。

2 个答案:

答案 0 :(得分:2)

我再次遇到这个问题,实际上找到了解决方案!

to-report listify-task [ tsk num-args ]
  let args (reduce word n-values num-args [ (word " (item " ? " ?)") ])
  report runresult (word "task [ (runresult tsk " args ") ]")
end

这会将记者任务从带有多个参数的事件转换为带有列表的事件。你这样使用它:

observer> show (runresult (listify-task task [?1 + ?2] 2) [4 5])
observer: 9

apply可以在此基础上实现,如:

to-report apply [ tsk args ]
  report (runresult (listify-task tsk length args) args)
end

虽然效率有点低。最好存储listify-task的结果以及任何需要的运行。

它基本上创建了以下形式的任务:task [ (runresult tsk item 0 ? item 1 ? ...)]

答案 1 :(得分:1)

无法完成(扩展名除外)。

实际上,我支持将此作为核心语言的补充。对于命令任务和报告任务,需要有单独的prims,就像runrunresult是分开的一样。

写它们(作为扩展prims,或作为核心prims)不会很难;它只涉及编写样板和胶水,而不是任何“真实”代码,并且查看runrunresult的实现方式将向您显示确切的操作。