11

cons を使用して要素をリストに結合することと、cons を使用してリストをスキームの要素に結合することの違いは何ですか?

さらに、cons はどのように機能するのでしょうか。リストの末尾または先頭に要素を追加しますか?

ありがとう!

4

1 に答える 1

27

プリミティブconsは単純に 2 つのものをくっつけます。それらのいくつかがリストと見なされるという事実は、付随的なものです。たとえば、これは機能し、ペア(コンス セルとも呼ばれます) を作成します。

(cons 1 2)
=> '(1 . 2)     ; a pair

の 2 番目の引数がconsたまたまリストの場合、結果は新しいリストになり、 の最初の引数がcons古いリストの先頭に追加されます。つまり、リストを作成するには、たとえ空であってもリストが必要です:

(cons 1 '(2 3))
=> '(1 2 3)     ; a list

(cons 1 (cons 2 '()))
=> '(1 2)       ; a list

(cons 1 '())
=> '(1)         ; a list

しかし、 の 2 番目の引数がconsリストでない場合、結果はただのペア、または不適切なリスト'()なります。

(cons '(1 2) 3)
=> '((1 2) . 3) ; a pair, not a list

(cons 1 (cons 2 3))
=> '(1 2 . 3)   ; an improper list

明確にするために、 を使用consしてリストの最後に要素を追加することはできません。リストを構築する通常の方法は、右から左に進み、先頭の位置で要素を逆に追加することです。たとえば、リストを構築したい'(1 2 3)場合は cons、要素を次の順序で構築する必要があり3 2 1ます。

(cons 3 '())                   ; list is '(3)
(cons 2 (cons 3 '()))          ; list is '(2 3)
(cons 1 (cons 2 (cons 3 '()))) ; list is '(1 2 3)

最後に 1 つの要素を追加する必要があるまれな場合 (信じてください。そうすると、通常、アルゴリズムが間違っていると考えていることになります) を使用できます。これは、引数として2 つのリストappendを受け取ります。

(append '(1 2 3) '(4))
=> '(1 2 3 4)
于 2013-10-06T20:48:24.723 に答える