Rebol模拟无限args任何例子来自这里所说的?

时间:2009-08-26 19:48:24

标签: rebol

http://www.rebol.org/ml-display-thread.r?m=rmlJNWS

格雷厄姆写道:

  

函数可以有可变数量的参数吗?   不,但你可以使用'any-type来模拟它!函数说明符和传递未设置!作为参数。更好的是使用改进。

2 个答案:

答案 0 :(得分:1)

该页面上的答案是:

是的,函数可以有可变数量的参数。这是一种功能,例如在:

take-n: func [n /local spec] [ 
     spec: copy [] 
     for i 1 n 1 [ 
         append spec to word! append copy "a" to string! i 
     ]
     func spec reduce [:reduce append reduce [to lit-word! append copy "take" to string! n] spec]
]
do take-n 4 1 2 3 4 
== [take4 1 2 3 4] 

答案 1 :(得分:1)

Rebol的默认方言(do方言)不支持调用具有可变数量参数的函数的概念。如果你想打破像这样的基本规则,那么你需要自己的方言。没有什么可以阻止你做出:

tweet [Hello World How Are You Today?]

但在这种情况下使用word!代替string!的想法有点狡猾,因为许多常见的推文对Rebol解析器无效:

tweet [LOL! :)]

忽略该问题,请注意默认情况下您不会获得任何表达式评估。所以这个tweet方言必须选择一种方式来显示你想要评估的地方。您可以使用get-word元素进行变量替换,并使用括号进行更一般的评估:

>> a: 10
>> b: 20
>> tweet [When you add :a and :b you get (a + b), LOL ":)"]
"When you add 10 and 20 you get 30, LOL :)"

BTW,在Rowland的例子中take-n没有返回一个块。不是直接的,我的意思是。用括号更好地理解它,并通过解决每个解释中隐含的“做”:

do [do (take-n 4) 1 2 3 4]

take-n只使用一个参数(“n”),然后返回一个带n个参数的函数。让我们称之为函数f,因此这个评估的第一步变成了等同于:

的东西
do [f 1 2 3 4]

当第二个开始时,该函数会运行......并且它返回一个块。在实践中,我怀疑你是否想要计算这样的参数。