2

私は現在LISPで遊んでいます。すべて問題ありませんが、次の問題がわかりません。

私はこの追加操作を持っています:

(define (append l1 l2)
   (if (eq? l1 null)
      l2
      (cons (first l1)
            (myappend (rest l1) l2))))

私はこのように使用します:

(myappend (cons (cons 1 2) null) '(4 5))

ラケットでの結果 は次のとおりです。

 '((1 . 2) 4 5)

しかし、なぜ?cons はリストを返し、myappends は 2 つのリストを追加するため、私の意見では'(1 2 4 5)にする必要があります。誰でも私を助けることができますか?LISP は何をしているのですか?

4

4 に答える 4

11

cons必ずしもリストではなく、ドット ペアを返します。

(cons 1 2)戻り値(1 . 2)

(cons 1 null)戻り値(1)

(cons 1 (cons 2 null))戻り値(1 2)

于 2012-04-07T17:28:07.060 に答える
4

Aは、最初のポインタ( )が1を指し、他の( )が2を(cons 1 2)指すオブジェクトを返します。そのため、ドットペア形式で出力されます。carcdr

また、より深く理解したい場合は、これらのトピックを非常によく説明しているCL:記号計算の穏やかな紹介「6.4。CONS、LIST、およびAPPENDの比較」を読むことをお勧めします。

于 2012-04-08T07:22:26.497 に答える