Netlogo扩展API-如何提醒用户错误?

Netlogo扩展API-如何提醒用户错误?,netlogo,Netlogo,我正在做一个netlogo扩展,将q-learning组件添加到代理中 开发人员必须使用reporterstate def agentset[要映射的变量]告诉扩展必须映射该品种的指定变量作为状态的一部分 因此,开发人员可以这样使用扩展: extensions [qlearningextension] breed [Creatures Creature] Creatures-own [ name ] to setup ask patch 0 0 [ sprout-Creat

我正在做一个netlogo扩展,将q-learning组件添加到代理中

开发人员必须使用reporter
state def agentset[要映射的变量]
告诉扩展必须映射该品种的指定变量作为状态的一部分

因此,开发人员可以这样使用扩展:

extensions [qlearningextension]

breed [Creatures Creature]

Creatures-own [
  name
]

to setup
  ask patch 0 0 [
    sprout-Creatures 1 [
      set name "joao"
    ]
  ]
  show qlearningextension:state-def Creatures ["nameee"]
end
由于扩展名拥有一个名为
name
的变量,并且开发人员正在传递“nameee”,因此扩展名将抛出一个异常,表示“繁殖生物不拥有nameee”

我想知道是否有一种方法可以像netlogo那样提醒用户,让用户知道他犯了错误(如图所示)


我可以想出几个选择

选项1

如果您可以使用
turtles own
变量(而不是
breeds own
),那么您可以在原语的系统定义中使用
语法.ReferenceType
。当NetLogo看到这个原语时,if将检查参数是否是它知道的变量的名称,并给出一个编译时错误,非常类似于您介绍的
balck

下面是Scala中的一个示例:

object ReferenceTypeTest extends api.Command {
  override def getSyntax =
    commandSyntax(
      right = List(ReferenceType),
      agentClassString = "-T--"
    )

  def perform(args: Array[api.Argument], context: api.Context) {
    val ref: Reference = args(0).asInstanceOf[org.nlogo.nvm.Argument].getReference
    println(ref.vn)
  }
}
args
获取的
Reference
值提供了变量编号
vn
,您可以根据需要与代理的变量数组一起使用以获取或设置值

一件棘手的事情是NetLogo将验证引用参数是否为真实变量,但它不会确认该变量是否用于特定的代理或品种。您必须在运行时手动检查用户是否给了您一个turtle变量,如果这是您所期望的

正如我所说,这似乎不适用于
自身的
变量。我不确定这是故意的还是疏忽,但这是不幸的

选项2

当您发现用户提供的变量名无效时,只需抛出一个漂亮的
ExtensionException
运行时错误。如果您自己进行检查,就可以非常清楚地了解值不正确的原因。这显然不如编译时消息好,但如果有某种泛型参数not found exception会更有帮助。检查数值的有效性,如果无效则抛出错误

选项3

编辑以添加此项

它接近选项1,只需使用
SymbolType
而不是
ReferenceType
,并使用
getSymbol
获取执行命令的参数。符号将包含一些令牌信息。与选项1一样,这不会保护您不被给定错误的变量(因此仍然需要运行时检查),但它至少允许用户为原语指定自己的变量名,并完成基本的编译时正确性检查