试图欺骗NetLogo执行作为参数传递的函数
以下操作将产生编译错误试图欺骗NetLogo执行作为参数传递的函数,netlogo,higher-order-functions,Netlogo,Higher Order Functions,以下操作将产生编译错误 to-report call-first/last [first/last a-list] report first/last a-list end 正文中的a-list将使用错误:预期命令高亮显示 所以我尝试了以下方法 to-report call-first/last [first/last a-list] report first map first/last (list a-list) end 此代码已编译!,但是当我试图让观察者执行它时 call-f
to-report call-first/last [first/last a-list]
report first/last a-list
end
正文中的a-list将使用错误:预期命令高亮显示
所以我尝试了以下方法
to-report call-first/last [first/last a-list]
report first map first/last (list a-list)
end
此代码已编译!,但是当我试图让观察者执行它时
call-first/last first [1 2 3]
call first/last突出显示错误消息:call-first/last预期有2个输入
有没有关于其他方法的想法
谢谢
另外,更重要的是,如果有一种方法可以在NetLogo中编写更高阶的函数,那么就要找到一种方法
更新:
要求观察者正确执行以下操作
呼叫最后一个[[a-list]->第一个a-list][1 2 3];=>一,
调用最早的最后一个[[a-list]->最后一个a-list][1 2 3];;=>三,
但这确实是一个漫长的道路
另一更新:
尝试
这是一份汇编
但是,要求观察者运行callfirst last first[1 2 3]会产生一个运行时错误:first expected 1 input
因此,问题似乎归结为除了使用上述匿名表达式之外,是否还有其他方法来编写返回函数的表达式?我不确定所有细节是否正确,但当我看到您尝试使用runresult时,我的第一个想法是使用runresult。这项工作:
to-report call-first-last [first-last a-list]
report runresult word first-last a-list
end
例如:调用first last last[1 2 3]
您需要为word和runresult添加一些括号,因为您需要使用两个以上术语的更复杂表达式。我不确定所有细节是否正确,但当我看到您尝试使用runresult时,我的第一个想法是使用runresult。这项工作:
to-report call-first-last [first-last a-list]
report runresult word first-last a-list
end
例如:调用first last last[1 2 3]
您需要为word和runresult添加一些括号,因为您需要使用两个以上的术语来处理更复杂的表达式
因此,问题似乎归结为,除了使用上述匿名表达式之外,是否还有其他方法来编写返回函数的表达式
答案归结为。。。没有
当您尝试编写call first/last first[1 2 3]时,您试图使用简洁的语法将过程传递给更高阶的过程:直接传递过程的名称,而不是像[xs->first xs]这样传递表达式。你可以在书中读到一些关于它的内容
此语法适用于内置的NetLogo原语,如map和foreach,但不适用于用户定义的过程。在不太正式的情况下,这是因为NetLogo原语的参数是类型化的:NetLogo知道map需要一个reporter作为其第一个参数,因此它可以正确解析像map first my list这样的调用。用户编写的代码不是这样的:NetLogo知道调用first/last过程的第一个/最后一个参数的类型
处理这一问题的标准方法是咬紧牙关,编写类似于callfirst-last[xs->first-xs][1 2 3]的代码
如果这真的困扰了你,你可以使用Jen的解决方案,尽管它会慢一点
你也可以。NetLogo扩展允许您编写与本机NetLogo过程类似的原语,从而支持简洁的语法。如果您有一整套这样的过程,那么它可能是值得的,但除此之外,仅仅保存几个字符就很麻烦了
旁注:当然,这取决于您,但我会避免在NetLogo变量名中使用/。语言允许它,是的,但是对于几乎所有查看代码的人来说,它看起来非常像一个划分
因此,问题似乎归结为,除了使用上述匿名表达式之外,是否还有其他方法来编写返回函数的表达式
答案归结为。。。没有
当您尝试编写call first/last first[1 2 3]时,您试图使用简洁的语法将过程传递给更高阶的过程:直接传递过程的名称,而不是像[xs->first xs]这样传递表达式。你可以在书中读到一些关于它的内容
此语法适用于内置的NetLogo原语,如map和foreach,但不适用于用户定义的过程。在不太正式的情况下,这是因为NetLogo原语的参数是类型化的:NetLogo知道map需要一个reporter作为其第一个参数,因此它可以正确解析像map first my list这样的调用。用户编写的代码不是这样的:NetLogo知道调用first/last过程的第一个/最后一个参数的类型
处理这一问题的标准方法是咬紧牙关,编写类似于callfirst-last[xs->first-xs][1 2 3]的代码
如果这真的困扰了你,你可以使用Jen的解决方案,尽管它会慢一点
你也可以。NetLogo扩展允许您编写与本机NetLogo过程类似的原语,从而支持简洁的语法。也许值得
如果你有一整套这样的过程,这是很困难的,但除此之外,仅仅保存几个字符就很麻烦了
旁注:当然,这取决于您,但我会避免在NetLogo变量名中使用/。语言允许它,是的,但是对于几乎所有查看代码的人来说,它看起来非常像一个划分