cons を使用して要素をリストに結合することと、cons を使用してリストをスキームの要素に結合することの違いは何ですか?
さらに、cons はどのように機能するのでしょうか。リストの末尾または先頭に要素を追加しますか?
ありがとう!
プリミティブ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)