0

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

グラハムは書いた:

関数は可変数の引数を持つことができますか?いいえ。ただし、「任意のタイプ」を使用してシミュレートできます。関数指定子と未設定の受け渡し!引数として。より良いのは、改良を使用することです。

4

2 に答える 2

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 に答える
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-n1つのパラメーター(「n」)のみで機能し、n個のパラメーターを受け取る関数を返します。その関数をfと呼びましょう。したがって、この評価のステップ1は、次のようなものになります。

do [f 1 2 3 4]

2番目のdoが開始されると、その関数が実行されます...そしてブロックを返します。実際には、このようなパラメータを数えたいとは思わないでしょう。

于 2009-12-15T05:39:19.493 に答える