试图欺骗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变量名中使用/。语言允许它,是的,但是对于几乎所有查看代码的人来说,它看起来非常像一个划分