それらをcons-cellsと考えると非常に理解しやすいです。
要するに、コンスセルは正確に2 つの値で構成されます。これの通常の表記法は、ドットを使用することです。次に例を示します。
(cons 'a 'b) ==> (A . B)
しかし、リストは LISP で頻繁に使用されるため、より適切な表記法はドットを削除することです。リストは、2 番目の要素を新しいコンス セルにし、最後の要素をターミネータ (通常は nil、'()Common Lisp では) で終了させることによって作成されます。したがって、これら 2 つは等しいです。
(cons 'a (cons 'b '())) ==> (A B)
(list 'a 'b) ==> (A B)
セルを(cons 'a 'b)作成し[a,b]、(list 'a 'b)を作成します[a, [b, nil]]。コンス セルでリストをエンコードするための規則に注意してください。それらは inner で終了しますnil。
ここで'a、最後のリストにコンスすると、 を含む新しいコンス セルが作成されます[[a, [b, nil]], a]。これは「適切な」リストではないため、つまり で終わっていないためnil、それを書き出す方法はドット: を使用することです(cons '(a b) 'a) ==> ((a b) . a)。
ドットが印刷されていない場合、構造体のリストである必要があります[[a, [b, nil]], [a, nil]]。
あなたの例
これを行う(cons 'a '(a b))と、シンボル'aとリストが取得'(a b)され、新しいコンス セルに配置されます。したがって、これは で構成されます[a, [a, [b, nil]]]。これは当然インナーで終わるので、nilドット抜きで書いています。
に関しては(cons '(a b) 'a)、これで が得られます[[a, [b, nil]], a]。これはinner で終了しないnilため、ドット表記が使用されます。
cons を使用して、最後の例を内側の nil で終わらせることはできますか? はい、そうすれば
(cons '(a b) (cons 'a '())) ==> ((A B) A)
そして最後に、
(list '(a b) 'a))
と同等です
(cons (cons (cons 'a (cons 'b '())) (cons 'a '())))