如何在REBOL中将函数作为参数传递

时间:2014-04-26 05:15:31

标签: rebol

我试图在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函数?

2 个答案:

答案 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"