(lambda (head . rest)
(...))
スキームを学ぼうとしているときにネットでこのコードに遭遇しましたが、有用な説明が見つかりませんでした。
これはどういう意味ですか?ML のようなパターン マッチングのようなものですか?(ちなみに、彼らはこのラムダを 1 つの引数にのみ適用します!)
この手順では:
(lambda (arg . args)
(...))
この構文は、lambda
フォームが name にバインドされた 1 つの必須引数と、 name にバインドされたarg
0 個以上の要素 (可変数の引数) を持つリストを期待していることを示していますargs
。これは可変個引数関数の例です。
名前付きプロシージャにも同じ構文を使用できます。任意の数のパラメータを必須として指定でき、その後は残りがオプションと見なされることに注意してください。この例を見てください:
(define (test arg . args)
(apply + arg args))
(test) ; will cause an error, at least one argument is expected
(test 10) ; returns 10
(test 10 4) ; returns 14
(test 10 4 2) ; returns 16
これが»ドットテール表記«です。これにより、任意の数の引数を関数に渡すことができます。説明については、 SICP、演習 2.20を検討してください (下にスクロールしてください)。