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