以下代码可以满足人们的期望。
(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
生成一个字符串,所以任何嵌入的字符串基本上都是附加到位而不是作为嵌入字符串处理?我希望带有嵌入字符串的字符串在嵌入字符串周围包含引号字符。如果嵌入的字符串本身具有嵌入的字符串,那将变得模糊不清。但这将是用户问题。
我该如何理解正在做什么?
假设您有以下列表:
let xs ["a" "b" "c"]
在内部,这个:
print (word xs)
相当于:
print (word "[" (reduce [ [acc x] -> (word acc " " x) ] xs) "]")
换句话说,word
只是在列表的每个元素上运行自己,并在两端和中间添加括号。
为什么它会降低setxy周围的报价?
事实上,这导致[a b c]
而不是["a" "b" "c"]
是一个经过深思熟虑的决定,或者只是在90年代后期编写代码的方式有点意外的结果?我,一个人,不能说。也许其他人会有更多的洞察力。
但是,如果你想使用这个怪癖来构建字符串化的代码块,我会说要马上进行。这种行为不太可能很快改变......