带有问号的高级netlogo代码出现问题

时间:2018-07-02 03:19:56

标签: netlogo

我正在使用Netlogo v6.0.4,当我尝试从我在Stack Overflow上找到的答案中运行示例代码时,收到以下错误消息。

  

没有名字吗?已定义

this中,提出以下netlogo代码作为答案:

to-report split [ string delim ]
  report reduce [
    ifelse-value (?2 = delim)
      [ lput "" ?1 ]
      [ lput word last ?1 ?2 but-last ?1 ]
  ] fput [""] n-values (length string) [ substring string ? (? + 1) ]
end

它喜欢的特定?是本节substring string ? (? + 1)的第一个。

2014年撰写此答案时,Netlogo v5处于积极使用状态,它具有称为tasks的功能,它们是lambda方法。但是在v6 tasks were replaced by anonymous-procedures中。

这里是?吗?如何解决此错误?

1 个答案:

答案 0 :(得分:3)

您将它放在一个版本中,其中?本质上是将变量传递给任务的占位符。 foreach的{​​{3}}就是一个很好的例子:

foreach [1.1 2.2 2.6] [ show (word ? " -> " round ?) ]
=> 1.1 -> 1
=> 2.2 -> 2
=> 2.6 -> 3

在这种情况下,foreach正在获取[1.1 2.2 2.6]的输入列表并对其进行迭代,其中?在正在处理的当前项目的命令块中占位。据我了解,6.X的主要语法差异在于,现在您可以使用->运算符来明确声明该占位符是什么。因此,与上述完全相同的想法在5.3 dictionary entryforeach示例中转换为6.0,看起来像这样:

foreach [1.1 2.2 2.6] [ x -> show (word x " -> " round x) ]
=> 1.1 -> 1
=> 2.2 -> 2
=> 2.6 -> 3

在那里,您可以看到x被明确定义为占位符。这确实提高了代码的清晰度-您可以定义占位符,但您想根据自己的意愿使之清晰明了-这个(上方)示例也可以正常工作:

foreach [ 1.1 2.2 2.6 ] [ round_me -> show (word round_me " -> " round round_me) ]

如果您使用多个列表,请注意,匿名过程必须用( )包围,而占位符声明必须用[ ]-例如:

( foreach [ 1 2 3 ] [ 10 20 30 ] [ [ a b ] -> print a * b ] )

然后,如果要翻译代码示例,则可以专注于显式声明占位符。它还可能有助于将其分解为各个组成部分,以使它们变得更清晰-注释中的详细信息:

to-report split2 [ string delim ]
  ; split the string up into individual characters
  let characters fput [""] n-values ( length string ) [ a -> substring string a ( a + 1 ) ]

  ;  build words, cutting where the delimiter occurs
  let output reduce [ [ b c ] -> 
    ifelse-value ( c = delim ) 
    [ lput "" b ] 
    [ lput word last b c but-last b ]
  ] characters

  report output
end

现在,要从链接的答案中跟随尼古拉斯的例子,您可以调用to-report来拆分文本:

to read-example
  let line "Example\tof\tsome\ttext"

  show split2 line "\t"
end

给你:

observer: ["Example" "of" "some" "text"]

希望有帮助!