0

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

格雷厄姆写道:

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

4

2 回答 2

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 :)"

顺便说一句,take-n在罗兰的例子中没有返回一个块。不是直接的,我的意思是。用括号可能会更好地理解它,并通过解决每种解释中隐含的“做”:

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

take-n仅使用一个参数(“n”),然后返回一个带有 n 个参数的函数。让我们称这个函数为 f,​​所以这个评估的第一步变成了相当于:

do [f 1 2 3 4]

当第二个 do 启动时,该函数开始运行......并且它正在返回一个块。在实践中,我怀疑您是否会像这样计算参数。

于 2009-12-15T05:39:19.493 回答
1

该页面上的答案是:

是的,一个函数可以有可变数量的参数。Do 就是这样一个函数,例如:

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] 
于 2009-08-26T21:07:07.627 回答