如何将 Scala 列表传递给 NetLogo

how to pass a scala List to NetLogo

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

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

我正在尝试这个:

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

但我在 ABM 的第 47 行收到错误 class:

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.apply(ABM.scala:47)

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

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

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

mkString接受的字符串是分隔符,

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

其他答案适用于大多数类型的值,但使用特定于 NetLogo 的 API 而不是通用的 Scala API 将适用于更多情况:

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

在您的输入列表中,这将生成字符串:

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

类型转换是不幸的,但为了让它在 Scala 类型(例如List[Double];通常 NetLogo 期望值是 AnyRef.

的子类型