关于NetLogo中`run`和`word`的问题

时间:2018-02-27 17:28:48

标签: netlogo

以下代码可以满足人们的期望。

(run [ [b n init] -> (run (word "create-" b " " n " [" init " ]"))] "turtles" 3 "setxy 19 4")

它创造了三只海龟并将它们放在(19,4)。我想在不引用初始化的情况下做一些相似的事情。所以我试过了:

(run [ [b n init] -> (run (word "create-" b " " n " " init ))] "turtles" 3 (list setxy -6 -4))

但是我收到一条错误消息:LIST expected 2 inputs on the right or any number of inputs when surrounded by parentheses.由于列表及其输入被括号括起来,我想问题是使用“setxy”而没有引号。

事实证明以下情况(令我惊讶)。

(run [ [b n  init] -> (run (word "create-" b " " n " " init ))] "turtles" 3 (list "setxy" -6 -7))

由于(list "setxy" -6 -7)生成["setxy" -6 -7],我不明白为什么会发生这种情况。

要查看发生了什么,我运行word (list "setxy" -6 -7) ""并获得了"[setxy -6 -7]"

我应该如何理解word正在做什么?为什么它会降低setxy周围的报价?是否因为word生成一个字符串,所以任何嵌入的字符串基本上都被附加到位而不是被视为嵌入字符串?我希望带有嵌入字符串的字符串在嵌入字符串周围包含引号字符。如果嵌入的字符串本身具有嵌入的字符串,那将变得模糊不清。但那将是用户问题。

1 个答案:

答案 0 :(得分:1)

  

我应该如何理解正在做什么?

假设您有以下列表:

let xs ["a" "b" "c"]

在内部,这:

print (word xs)

相当于:

print (word "[" (reduce [ [acc x] -> (word acc " " x) ] xs) "]")

换句话说,word只是在列表的每个元素上运行,并在两端和中间添加括号。

(相关代码为herehere。)

  

为什么它会降低setxy周围的报价?

这是否会导致[a b c]而不是["a" "b" "c"]做出深思熟虑的决定,或者只是在90年代后期编写代码的方式有些意外后果?我不能说。也许别人会有更多的见解。

但是,如果你想用这个怪癖来构建字符串化的代码块,那我就说吧。这种行为不太可能很快改变......