NetLogo语法困惑(`word`和`runresult`)

时间:2014-08-26 21:19:49

标签: netlogo

模型"人工神经网络 - 多层"有这个代码(目标函数来自界面,其值为' xor'或'或'):

to-report target-answer
  let a [activation] of input-node-1 = 1
  let b [activation] of input-node-2 = 1
  ;; run-result will interpret target-function as the appropriate boolean operator
  report ifelse-value run-result
    (word "a " target-function " b") [1][0]
end

我不明白' a'而且' b'如果它们在引号内,则转换为true或false。为什么他们只是出现在' a'和' b'?如果代码是

    (word a " " target-function " " b) [1][0]

其实也有效,我可以理解语法,但是" a"和" B"困惑我。任何人都可以解释为什么这段代码有效吗?

1 个答案:

答案 0 :(得分:2)

关键是run-resultrun-result运行给定的字符串,就好像它是代码一样。因此,如果target-functionor,那么

ifelse-value run-result
    (word "a " target-function " b") [1][0]

相当于

ifelse-value run-result "a or b" [1][0]

相当于

ifelse-value (a or b) [1][0]

至于为什么这比(word a " " target-function " " b)更可取,这部分是品味问题。它的击键次数更少,看起来可能更清晰。它还可以更好地处理某些类型的值。 <{1}}在创建要运行的字符串之前粘贴(word a " " target-function " " b)a 的值,而b在实际运行时绑定值串。虽然这里永远不会有问题,但是如果我们有类似的代码那么重要:

(word "a " target-function " b")

let s "some string" print runresult (word "length " s) 出现错误,因为它确实会尝试评估Nothing named SOME has been defined。将此与

进行比较
length some string

打印出let s "some string" print runresult (word "length s")

任务

在评论中,Seth提出了一个很好的观点,即实现这一目标的现代方法是使用tasks。要对任务执行此操作,我们会在代码中的其他位置将11设置为target-functiontask or的简写)。

然后我们将task [?1 or ?2]更改为:

run-result (word "a " target-function " b")

这只是说“使用(run-result target-function a b) target-function作为输入运行存储在a中的代码并给我结果”。更干净!