在 Netlogo 中将字符串转换为变量名

问题描述

我试图使用 set 命令更新一堆全局变量

全局变量是不同字符串的组合。

例如,我有 6 个全局变量

a_x、b_x、c_x、a_y、b_y、c_y

我想使用 foreach 命令将所有六个全局变量的值更新为 1。

下面是我的代码

let a_x 0
let b_x 0
let c_x 0
let a_y 0
let b_y 0
let c_y 0

let first_list (list "a" "b" "c")
let second_list (list "x" "y")

foreach first_list [
   [i] -> 
   foreach second_list [
     [j] -> 
   set (word i "_" j) 1
 ]
]

我收到了“这不是您可以使用“设置”的内容错误消息。

我想我可能需要将字符串 (word i "_" j) 转换为变量名,以便 Netlogo 可以通过 set 命令更新它。

有什么办法可以在 Netlogoforeach 循环中将字符串转换为变量名称吗?

解决方法

您可以在字符串上使用 the run primitive 来执行您从字符串构建的 NetLogo 代码。您可以将其用于 set 全局变量。您可以构造整个 word 语句,然后 set a_x 1 那个。

这不适用于局部 run 变量,但是,由于 let 在与字符串值一起使用时处理范围的方式。

这里是您的示例,其中更新了可以工作的全局变量:

run

编辑以添加第二个选项。

您也可以使用 the table extension 来存储值。它可以使用字符串作为键(您的变量名称),并存储您喜欢的任何值。根据您的用例,这总体上可能会更容易/更简单。

,

恐怕你不能那样做。您试图将包含变量名称的字符串视为变量,这不起作用。

也许你能得到的最接近的是这个,假设 a_x b_x c_x ...已经定义为全局或局部变量:

让变量列表(列表 斧头 b_x c_x ...)

foreach list-of-variables [ next-variable -> set next-variable 1 ]