3

次の違いは何ですか:

(cons 'a (cons 'b 'c)) ;; (A B . C)

(cons 'a '(b.c)) ;; (A B.C)

cons を使用して次のリスト ((ab).c) を作成する必要があるため、「.」が何であるかを理解しようとしています。を表します。

LE : 私は次のものを持っています(cons (cons 'a 'b) 'c)が、それは生成((A . B) . C)されません((A.B).C)(余分なスペースに注意してください)

4

3 に答える 3

6

スペースは、リスト トークンを区切るために使用されます。 A.B単一のトークンです。 (A.B)単一の要素を持つリストです。 as carとas cdr(A . B)を持つコンスセルです。AB

コンスセルは、「もの」(オブジェクト) のペアです。あなたの場合、これらはシンボルでありAB、 などの名前が付けられています。そのようなセルの印刷表現は(A . B)、たとえば です。これを「ドット表記」と呼びます。最初の要素は「car」、2 番目の要素は「cdr」と呼ばれます。

関数consはそのようなセルを作成します。 (cons 'a 'b)したがって、セルが生成され(A . B)ます。 名前は常に内部的に大文字であることに注意してください

これはおそらく教師が望んでいたこと((A . B) . C)であり、正しい出力であり、コードは正しい答えです。これは、車が別のセルを指しているセルで、cdr には が含まれていますC。その他のセルは、車が含まれているセルAと cdrBです。

ちなみに、リストはそのようなコンスセルの線形チェーンであり、car は常に値を保持し、cdr はリストの残りを指します。最後の cdr はどこも指していません (Lisp では NIL と呼ばれます)。ドット表記では、リストは例えば(A . (B . (C . NIL))). リストは重要なので、次のように短く書くことができます(A B C)。最後の CDR が NIL の代わりに値を持つ場合、それはドット表記で示されます。たとえば、 の(A . (B . (C . D))))ように記述できます(A B C . D)

于 2009-12-07T13:51:43.003 に答える
6

.2 つの文字の間は記号の一部です。b、 .b.cの 3 文字の名前を持つシンボルです。、および

を入力するFOO.BARと、Lisp はそれを 1 つのシンボルとして読み取ります。

入力する(FOO.BAR)と、Lisp はそれを内容として 1 つのシンボルを含むリストとして読み取ります。

入力すると、Lisp はそれをCARおよびCDRとして(FOO . BAR)コンス セルとして読み取ります。FOOBAR

.コンスセルのCARCDRを分離するために使用されます(a . b)。の周りのスペースに注意してください.

(cons 'b 'c)bシンボルをCARとし、シンボルcCDRとして コンス セルを作成します。と書かれてい(b . c)ます。

(cons 'a '(b.c))は 2 つのシンボルのリストを作成しab.c. と書かれてい(a b.c)ます。

((A.B).C)は常に として出力され((A.B) . C)ます。また、リストではありません。

((a.b) . c)(a.b)リストをCARとし、シンボルcCDRとするコンスセルです。

于 2009-12-07T13:38:13.470 に答える
1

これが Lisp の学習過程にある場合、スペースは括弧に対して重要ではなく、正しい答えはあなたが与えたものであるため、質問はおそらく暗黙の「スペースは許可されていません」というルールを意味していませんでした。

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

于 2009-12-07T13:40:50.977 に答える