从参数表更新全局变量而不在字符串上使用`run`

时间:2014-10-07 20:33:32

标签: netlogo

如文档所述,当涉及局部变量(包括过程参数)时,在字符串上使用run会遇到问题。那么,实现以下目标的推荐方法是什么?

我有参数表(p1,p2等),按名称指定全局变量的值(即,表键是字符串,对应于全局变量的名称)。给定一个名称(作为字符串)和一个参数表,我想将命名的全局变量设置为表值。例如,如果我们使用run,如果值都是数字,我们可能会这样做:

to update [#nm #tbl]
    let %tval table:get #tbl #nm
    run (word "set " #nm " " %tval)
end

建议的方法是什么,避免字符串(由于文档中的警告)?

作为一个额外的复杂功能,一些表值可能是任务。

问题的延伸:

继续我10月9日的评论,我发现如果我将作业分离到一个程序,我也可以连续完成任务的全局作业。如,

to setGlobalTasks [#name #table]
  ;; #name : string, name of global variable
  ;; #table : table, maps names (strings) to values (reporter tasks)
  let %tval table:get #table #name
  run (word "set " #name " %tval")
end

Seth提供了一些保证,当指定的值为数字时,以这种方式继续在NetLogo中继续工作。当指定的值是任务时,这会有风险吗?它在NetLogo 5.1中是否存在任何风险?

注意:问题的这个扩展可能应该在评论中,但我无法在评论中格式化代码块。

1 个答案:

答案 0 :(得分:1)

%tval在双引号之外的原始方法仅适用于普通值(如数字,列表或字符串)的表值,这些值可以在往返字符串和返回后继续存在。 (如果你在练习中遇到麻烦,我的猜测是run当你试图将它与foreach结合时会感到困惑,就像你在http://groups.google.com/forum/#!topic/netlogo-devel/m5rnPEsxR44发布的代码一样。我相信这可以通过编写一个独立的程序来处理你的问题。)

您的修订代码,其中%tval在双引号内,并且整个内容在单独的过程中被隔离,是正确的,并且应该适用于所有可能的表值。它应该在NetLogo 5.0和5.1中运行良好,如果有6.0,它几乎肯定在6.0中。

(在Tortoise中,它不会起作用,因为run可能在Tortoise中根本不会支持字符串。)

正反思:

字符串上的

run有点难看。在你想要"反思"按名称设置变量,其中名称存储在运行时计算的字符串中,如果有一个直接支持它的扩展名,那将会很好。好消息是,扩展的代码将非常简短。 NetLogo中所需的方法(扩展将调用)已经存在。坏消息是,如果您喜欢编写和编译简单的Java(或Scala)代码,那么编写任何类型的NetLogo扩展都很容易。无论如何,如果这样一个反思"扩展存在。但与此同时,你对自己拥有的东西安全。