それらを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 '())))