質問

次の違いは何ですか:

(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 の学習の過程にある場合、スペースは括弧に対して重要ではないため、質問はおそらく暗黙の「スペースを許可しない」ルールを意味するものではなく、正しい答えはあなたが与えたものです。

特に、右括弧の後のスペースは常に追加されますが、これは人間が読みやすいようにするためだけです。印刷しないように要求するのは意味がありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top