Netlogo扩展API-如何提醒用户错误?
我正在做一个netlogo扩展,将q-learning组件添加到代理中 开发人员必须使用reporterNetlogo扩展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
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一样,这不会保护您不被给定错误的变量(因此仍然需要运行时检查),但它至少允许用户为原语指定自己的变量名,并完成基本的编译时正确性检查