(cons 'a (cons 'b 'c)) と (cons 'a '(b.c)) の Lisp の違い
質問
次の違いは何ですか:
(cons 'a (cons 'b 'c)) ;; (A B . C)
そして
(cons 'a '(b.c)) ;; (A B.C)
consを使って次のようなリスト((a.b).c)を作成する必要がある。 を表している。
L.E.:私は次のものを持っています (cons (cons 'a 'b) 'c)
しかしそれは生み出す ((A . B) . C)
そしてそうではありません ((A.B).C)
(余分なスペースに注意してください)
解決
スペースはリストのトークンを区切るために使用されます。 A.B
単一のトークンです。 (A.B)
単一の要素を含むリストです。 (A . B)
はコンセルです A
車として、そして B
CDRとして。
コンスセルは、「もの」(オブジェクト)のペアです。あなたの場合、これらのものはシンボルであり、名前が付けられています A
, B
, 、など。このようなセルの印刷表現は次のようになります。 (A . B)
, 、 例えば。これを「ドット記法」といいます。最初の要素は「car」、2 番目の要素は「cdr」と呼ばれます。
関数 cons
このようなセルを作成します。 (cons 'a 'b)
こうして細胞が生成されます (A . B)
. 名前は内部的に常に大文字に変換されることに注意してください.
おそらく先生が望んでいることなので、 ((A . B) . C)
は正しい出力であり、コードは正しい答えです。これは、車が別のセルを指すセルであり、cdr には次の内容が含まれます。 C
. 。他のセルは、車が入っているセルです。 A
そしてCDR B
.
ちなみに、 リスト は、そのようなコンス セルの線形チェーンであり、car は常に値を保持し、cdr はリストの残りの部分を指します。最後の cdr はどこも指していません (これは Lisp では NIL と呼ばれます)。ドット表記では、リストは次のようになります。 (A . (B . (C . NIL)))
. 。リストは重要なので、次のように短く書くことができます。 (A B C)
. 。最後の CDR に NIL ではなく値がある場合は、ドット表記で表示されます。 (A . (B . (C . D))))
次のように書くことができます (A B C . D)
.
他のヒント
.
2 つの文字の間にあるのは記号の一部です。 b.c
は 3 文字の名前を持つシンボルです。 b, ., 、 そして c.
入力すると FOO.BAR
, 、すると、Lisp はそれを 1 つのシンボルとして読み取ります。
入力すると (FOO.BAR)
すると、Lisp はそれを、内容として 1 つのシンボルを含むリストとして読み取ります。
入力すると (FOO . BAR)
次に、Lisp はそれをコンスセルとして読み取ります。 FOO
として 車 そして BAR
として CDR.
.
を分離するために使用されます 車 そしてその CDR コンスセルの: (a . b)
. 。周囲のスペースに注意してください .
.
(cons 'b 'c)
シンボルを含むコンスセルを作成します b
として 車 そしてそのシンボル c
として CDR. 。と書かれています (b . c)
.
(cons 'a '(b.c))
2 つのシンボルのリストを作成します。 a
そして b.c
. 。と書かれています (a b.c)
.
((A.B).C)
常に次のように出力されます ((A.B) . C)
. 。それもリストではありません。
((a.b) . c)
はリストのコンセルです (a.b)
として 車 そしてそのシンボル c
として CDR.
これが Lisp の学習の過程にある場合、スペースは括弧に対して重要ではないため、質問はおそらく暗黙の「スペースを許可しない」ルールを意味するものではなく、正しい答えはあなたが与えたものです。
特に、右括弧の後のスペースは常に追加されますが、これは人間が読みやすいようにするためだけです。印刷しないように要求するのは意味がありません。