我从自定义扩展程序“myextension”中遇到了一个问题。我正在使用NetLogo v.5.0.5。
这是Java类记者的代码:
public class DoActionPrimitive extends DefaultReporter {
@Override
public Syntax getSyntax() {
return Syntax.commandSyntax(
new int[]{
Syntax.WildcardType(), // Platform
Syntax.StringType(), // Action
Syntax.ListType()}, // Parameters
Syntax.WildcardType());
}
public Object report(Argument[] args, Context context)
throws LogoException, ExtensionException {
// Reporter code
}
}
这是给出NetLogo编译错误的代码:
extensions [myextension]
globals [platform]
turtles-own [logged-in?]
to setup
clear-all
reset-ticks
create-turtles population
set platform myextension:create "Platform"
ask turtles [ set logged-in? login ]
end
to-report login
report myextension:do-action platform "login" ["test-user" "123456"]
end
NetLogo代码选项卡在行上显示语法错误:
report myextension:do-action platform "login" ["test-user" "123456"]
带有消息:
"MYEXTENSION:DO-ACTION expected 8191 inputs, any input, a string and a list."
我猜想记者语法有问题,也许不可能将WildcardType与其他参数混合在一起。我也试过切换第一个和第二个参数,所以在WildcardType之前使用StringType但是错误是相同的但是在错误消息中切换参数。
为什么NetLogo在我指定的语法输入之前需要8191个输入?
谢谢!
答案 0 :(得分:1)
您使用的Syntax.commandSyntax
仅用于命令。你想要Syntax.reporterSyntax
。假设Syntax.WildcardType()
是您的返回类型,并且您希望记者可以由任何代理运行,您可以将Syntax.commandSyntax
更改为Syntax.reporterSyntax
我相信。这会调用this implementation of reporterSyntax
。
您收到该错误消息的原因(如果您感到好奇)是因为您的代码正在调用this implementation of commandSyntax
。然后将第二个参数解释为命令的默认参数个数(它旨在与可变参数命令一起使用)。 NetLogo中的类型是每个二进制数字对应于某种基本类型的数字。对于所有允许的类型,该数字为1,对于不在其二进制表示中的数字,该数字为0。因此基本类型(NumberType
,StringType
等)在一个数字中只有1。 WildcardType
应该是任何东西,因此它应该在与该类型对应的所有数字中都有1。它的二进制表示为1111111111111
,十进制为8191
,即错误消息中的数字。