私はSchemeコードのこの作品がありますこれはどのように定義されていますか?
(define (x . y) y)
(x 1 2 3)
を、私はそれが同等に知っている:
'(1 2 3)
しかし、私はなぜ理解できません。
最初のコード行は何をしますか?
ありがとうございます。
私はSchemeコードのこの作品がありますこれはどのように定義されていますか?
(define (x . y) y)
(x 1 2 3)
を、私はそれが同等に知っている:
'(1 2 3)
しかし、私はなぜ理解できません。
最初のコード行は何をしますか?
ありがとうございます。
最初の行(define (x . y) y)
は、5.2 Definitions(前の節)に従って(define x (lambda y y))
に相当します。
(lambda y y)
は手順です。すべての引数が呼び出されると、新しく割り当てられたリストに格納されます。例えばlist
は、(define list (lambda xs xs))
と定義できます。 (4.1.4 Procedures第2形式の仮パラメータを参照してください。)
したがって(x 1 2 3)
は(list 1 2 3)
に相当します。
あなたの答えをありがとう、私は疑いがあります:なぜ '(lambda y)'が無制限の引数を受け入れるのですか? '(λ(y)y)'との違いは何ですか? (それはただ1つの議論を受け入れる)。私はr6rsの標準を読んでいるが、私は何かが足りない。ありがとうございました。 – Aslan986
'xと言うときには引数の数に制限はありません。 y'または '(lambda y y)'を指定すると、不適切なリストが定義されます。したがって、この文脈では、「y」は要素の単一のリストまたは全体のリストを参照することができる。この文脈では、yはリスト内の単一の要素であるため、これは '(lambda(y)y)'の定義とは異なります。 –
'(lambda y y)'の仮パラメータ部分は 'y'で、'(lambda(y)y) 'は'(y) 'です。無制限の引数を受け入れるプロシージャは便利なので、多くのプログラミング言語がサポートしています。リスプでは、可変的な議論を示す多くの方法があります。 CLは特殊記号&restなどを使用します。そして、Schemeはただの短所を使います:仮パラメータ部分は、連鎖(固定部分、おそらく空)と空のリストで終わる(それ以上の引数を受け入れることはできません)か、記号で終わります(無制限の引数を受け入れます)。 – OwnWaterloo
これらは同等ではありません。 (x 1 2 3)は(リスト1 2 3)と同じです。で、何がのぞみ? R6RSは非常に読みやすい文書であり、関数の定義とパラメータについてはすべてがあります。 – yazu