http://www.rebol.org/ml-display-thread.r?m=rmlJNWS
格雷厄姆写道:函数可以有可变数量的参数吗? 不,但你可以使用'any-type来模拟它!函数说明符和传递未设置!作为参数。更好的是使用改进。
答案 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]
当第二个开始时,该函数会运行......并且它返回一个块。在实践中,我怀疑你是否想要计算这样的参数。