如何将scala List传递给NetLogo

时间:2016-02-10 14:56:27

标签: scala netlogo

我有一个Scala列表,我正在尝试将其传递给我的NetLogo模型:

> myscalalist
List(2015-01, 2015-02)

我正在尝试这个:

App.app.command("set months " + myscalalist)

但我在ABM班的第47行遇到错误:

Illegal number format at position 54 in 
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:30)
at org.nlogo.lex.Tokenizer.tokenize(Tokenizer.scala:26)
at org.nlogo.compiler.CompilerMain$.compile(CompilerMain.scala:23)
at org.nlogo.compiler.Compiler$.compileMoreCode(Compiler.scala:34)
at org.nlogo.workspace.Evaluator.org$nlogo$workspace$Evaluator$$invokeCompiler(Evaluator.scala:175)
at org.nlogo.workspace.Evaluator.evaluateCommands(Evaluator.scala:18)
at org.nlogo.workspace.AbstractWorkspaceTraits$Evaluating$class.evaluateCommands(AbstractWorkspaceScala.scala:163)
at org.nlogo.workspace.AbstractWorkspaceScala.evaluateCommands(AbstractWorkspaceScala.scala:19)
at org.nlogo.app.App.command(App.scala:849)
at main.jago.ABM$$anonfun$simulate$1.apply(ABM.scala:47)

是否有任何建议将安全列表从Scala应用程序传递给NetLogo?

2 个答案:

答案 0 :(得分:3)

另一个答案适用于大多数类型的值,但使用特定于NetLogo的API而不是一般的Scala可以在更多情况下使用:

org.nlogo.api.Dump.logoObject(
  org.nlogo.api.LogoList(
    myscalalist.asInstanceOf[Seq[AnyRef]]: _*),
  true, false)

在输入列表中,这会产生字符串:

["2015-01" "2015-02"]

类型转换是不幸的,但为了使其在Scala类型(例如Scala类型)上工作,这是必要的。 List[Double];通常NetLogo期望值为AnyRef的子类型。

答案 1 :(得分:2)

我不知道NetLogo或它的api。但假设它需要一个字符串并解析它,错误可能是toString在scala列表上工作的方式

在您的列表中使用.mkString(", ")方法,这会将List(2015-01, 2015-02)变为"2015-01, 2015-02"

mkString接受的字符串是分隔符

App.app.command("set months " + myscalalist.mkString(", "))