我试图在REBOL编程语言中将函数作为参数传递,但我还没有找到正确的语法:
doSomething: func [a b] [
a b
a b
]
doSomething print "hello" {This should pass print as the first argument and "hello" as the second argument.}
这会产生错误,因为正在调用print
函数而不是传递函数:
hello
*** ERROR
** Script error: doSomething does not allow unset! for its a argument
** Where: try do either either either -apply-
** Near: try load/all join %/users/try-REBOL/data/ system/script/args...
是否可以将print
函数作为参数传递而不是调用print
函数?
答案 0 :(得分:5)
我找到了解决方案:我只需要在作为参数传递的函数名称之前添加:
。
这里,:print
函数作为参数传递,而不是以“hello”作为参数调用:
doSomething: func [a b] [
a b
a b
]
doSomething :print "hello" {This should pass print as the first argument and "hello" as the second argument.}
答案 1 :(得分:2)
你已经发现,根据系统的性质,当口译员遇到一个字时!已绑定到函数的符号类型,默认情况下将调用该函数。默认解释器看到GET-WORD!另一方面,符号类型禁止调用,只返回单词绑定的值。
评估器逻辑实际上非常简单,当它看到某种符号类型时它会如何反应。抑制调用的另一种方法是单引号,它会给你一个LIT-WORD!符号...但这些被评为相应的WORD!当它看到它们时:
>> some-word: 'print
>> type? some-word
== word!
事实上,GET-WORD的行为!当评估者看到它等同于使用带有WORD的GET函数时!
doSomething: func [a b] [
a b
a b
]
doSomething get 'print "hello" {Message}
口译员看到了LIT-WORD! 'print
并将其评估为WORD! for print
,然后传递给GET,它给你一个功能!回来。
解释器逻辑的简单性就是为什么你得到这样的东西:
>> a: b: c: 10 print [a b c]
10 10 10
由于它如何处理SET-WORD的性质!符号后跟完整的表达式。这也产生以下代码打印20:
if 10 < a: 20 [
print a
]
其他语言通过专门的结构(如多次初始化等)实现这些功能,但Rebol的逻辑更简单。
只是想详细说明一下,以帮助解释你在看什么。我对这个其他问题的回答可能会对边缘案例,历史和未来提供一些更深入的了解:"When I use error? and try, err need a value"