1

この質問に対する答えを多かれ少なかれ理解した後、Racket/Scheme では、読者レベルで、構文ツリーの各ペアの 2 番目の要素がリストでなければならないように見えます。言い換えると、フォームのドット付き s 式が(A . B)構文ツリーの頂点を表すときはいつでも、Bのようにリストとして解析する s 式によってのみ可能(C D E)です。例: (A . (C D E)). もちろん(A C D E)、これは同じように解析されるため、 と書くことができます。

(+ . (1 2 3)) ; => 6
(+ 1 2 3) ; => 6

(define . (x 1))
x ; => 1
(define y 2)
y ; => 2

私の質問は、「ドット ペア」の s 式が、リテラル データ内以外で、Racket/Scheme 構文で許可されている理由は何ですか? ペアを使用して記述できるが、リストを使用して簡単に記述できない Racket/Scheme 式の例はありますか?

4

1 に答える 1

3

どの Lisp システムでも、読み取りと評価は別のステップです。読者にとっては、すべてがリテラル データです。quote何を評価し、何を (とによってquasiquote) リテラル データとして扱うかを決定するのはエバリュエーターです。

リーダーは、次の式をまったく同じように読みます。

(+ 1 2 3)
(+ . (1 2 3))
(+ . (1 . (2 3)))
(+ . (1 . (2 . (3))))
(+ . (1 . (2 . (3 . ()))))

これは、基本的なレベルでは、空でないリストは一連のコンス セルで構成されており、cdr別のリスト (空であるかどうかに関係なく) を指す があるためです。

さらに、不適切なリストを使用する正規の Scheme 式もありますラムダの残りの引数は、この代表的な例です。

(define (list . items)
  items)
于 2013-03-27T16:20:14.960 に答える