11

argumentsJavascriptの配列に似たものを探しています:

function parent(){
  child.apply(this.arguments);
}

可変引数の長さのドット表記とスキームのapply機能を認識しています。

ドットが最初の引数と見なされるため、これは機能しないようです。

(define (parent .) 
          (list .))

(parent 1 3 4 6 7)
Error: bad argument count - received 5 but expected 1: #<procedure (array arg-list)>

これは機能しますが、理想的ではありません。args リストを定義するための追加の構文を使用せずに関数を呼び出したいと思います。

(define (parent args-list)
     (apply list args-list))


(parent 1 3 4 6 7)
Error: bad argument count - received 5 but expected 1: #<procedure (array args-list)>

(parent `(1 3 4 6 7))
(1 3 4 6 7)
4

2 に答える 2

16

正しい構文は次のとおりです。

(define (parent . args-list)
    <do something with args-list>)

次のように使用します。

(parent 1 2 3 4 5)

プロシージャ内では、すべての引数が という名前のリストにバインドされargs-listます。上記のスニペットでは、その値としてargs-list持っています。'(1 2 3 4 5)これは、可変個引数関数が Scheme でどのように機能するかの例です。

完全を期すために、同じメカニズムを無名関数にも使用できます (括弧で囲まれてargs-listないことに注意してください)。

((lambda args-list <do something with args-list>) 1 2 3 4 5)
于 2012-10-17T19:47:52.923 に答える
6

あなたがしたい:

(define (parent . args) 
   args) ; args is a list

これは実際には の「デフォルト」実装ですlist

(define (list . x) x)

適用時のエラーメッセージが(define (parent . ) ...)間違っているようです。また、コードは無効な構文であるため、そもそもコンパイルされていないはずです。使用している Chicken Scheme のバージョンにバグがある可能性があります。

于 2012-10-17T19:47:31.123 に答える