Rebol模拟无限参数这里有什么例子吗?

Rebol模拟无限参数这里有什么例子吗?,rebol,Rebol,格雷厄姆写道: 一个函数可以有可变数量的参数吗? 不,但你可以用“任何类型”来模拟它!函数说明符和传递未设置!作为论据。更好的方法是使用改进 该页的答案是: 是的,函数可以有数量可变的参数。Do是这样一种功能,例如: take-n: func [n /local spec] [ spec: copy [] for i 1 n 1 [ append spec to word! append copy "a" to string! i ]

格雷厄姆写道:

一个函数可以有可变数量的参数吗? 不,但你可以用“任何类型”来模拟它!函数说明符和传递未设置!作为论据。更好的方法是使用改进


该页的答案是:

是的,函数可以有数量可变的参数。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] 
Rebol的默认方言(do方言)不支持调用具有可变参数数的函数的概念。如果你想打破这样一个基本的规则,那么你需要你自己的方言。没有什么能阻止你做:

tweet [Hello World How Are You Today?]
但是使用
单词的想法而不是
字符串在这种情况下有点狡猾,因为许多常见的tweet对于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启动时,该函数开始运行…并返回一个块。实际上,我怀疑您是否希望像这样计算参数。

take-n返回一个块,因此这是一个参数。事实上,我没有问正确的问题,我更希望能够写一些像推特Hello World这样的东西,而不是推特“Hello World”。最后我找到了一个方法。非常感谢你的回答总是很周全,我将有一个漫长的周末来彻底地阅读它们:)