http://www.rebol.org/ml-display-thread.r?m=rmlJNWS
グラハムは書いた:
関数は可変数の引数を持つことができますか?いいえ。ただし、「任意のタイプ」を使用してシミュレートできます。関数指定子と未設定の受け渡し!引数として。より良いのは、改良を使用することです。
http://www.rebol.org/ml-display-thread.r?m=rmlJNWS
グラハムは書いた:
関数は可変数の引数を持つことができますか?いいえ。ただし、「任意のタイプ」を使用してシミュレートできます。関数指定子と未設定の受け渡し!引数として。より良いのは、改良を使用することです。
そのページの答えは次のとおりです。
はい、関数は可変数の引数を持つことができます。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?]
しかし、この場合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
1つのパラメーター(「n」)のみで機能し、n個のパラメーターを受け取る関数を返します。その関数をfと呼びましょう。したがって、この評価のステップ1は、次のようなものになります。
do [f 1 2 3 4]
2番目のdoが開始されると、その関数が実行されます...そしてブロックを返します。実際には、このようなパラメータを数えたいとは思わないでしょう。