5

私は短所を使ってこれを行う方法を理解しようとしています:

((A . B) . (C . D))

(A . B)(C . D)は各コンスセルのどこにありますか

私はこれをやってみまし(cons (cons 'a 'b) (cons 'c 'd))たが、それは私にこれを与えます:

((A.B) C . D)

私もこれを試しました:(cons (cons 'a 'b) (cons (cons 'c 'd) ()))しかし、それは私にこれを与えます:

((A . B) (C . D))

これを達成する方法はありますか?

4

4 に答える 4

15

最初のものはあなたが望むものです。それらは同等です。次のように確認できます。

1 ]=> (cons (cons 'a 'b) (cons 'c 'd))

;Value 11: ((a . b) c . d)

1 ]=> (car (cons (cons 'a 'b) (cons 'c 'd)))

;Value 12: (a . b)

1 ]=> (cdr (cons (cons 'a 'b) (cons 'c 'd)))

;Value 13: (c . d)

リストはコンスセルであることを思い出してください。「car」はリストの先頭要素またはコンスセルの前半であり、cdr はリストの残りまたはコンスセルの 2 番目の要素です。

それらが同等であることを確認する別の方法:

1 ]=> '((a . b) . (c . d))

;Value 14: ((a . b) c . d)
于 2010-12-15T01:50:00.200 に答える
7

リテラルを入力したときに返されるものを見てください((A . B) . (C . D))

* '((あいうえお))

((あいうえお)

ペアから構築されたデータ構造を出力するために Lisp プリンターが使用するアルゴリズムが定義されています。基本的に、コンスが別のコンスの CDR である場合、コンスを括弧内のドット ペアとして出力することはできません。

ただし、 SET-PPRINT-DISPATCHを使用して、求めている動作が得られるようにプリンターを再構成することができます。

(set-pprint-dispatch '短所
  (ラムダ (ストリーム オブジェクト)
    (フォーマット ストリーム "(~W . ~W)" (car オブジェクト) (cdr オブジェクト))))
* '((あいうえお))

((あいうえお))
* (cons (cons 'a 'b) (cons 'c 'd)) ;同じオブジェクト

((あいうえお))

それにもかかわらず、デフォルトの動作を読むことに慣れていれば、長期的には率直に言ってより良いでしょう.

于 2010-12-15T01:47:31.703 に答える
0

Lisp でのリストの表現方法が原因で、あなたが探していることは不可能です。リストを作成すると、一連のコンス セルが作成されます。ここで、セルの car はリスト内のその要素の値であり、cdr は次のコンス セルへの参照です。目的のセルは、 「車があり、cdr が((A . B) . (C . D))あるコンスセルを作成する」ことを意味します。これは、最初の要素が、2 番目の要素が、リストの末尾が、 またはであるリストと同等です。(A . B)(C . D)(A . B)CD((A . B) C . D)

于 2010-12-15T01:49:57.407 に答える
0

私はあなたが何を意味するのかよくわかりません...コードの最後の行が最初の行に似ているという上記のコメントに同意します。

とにかく、これはまともな一般的なリソースです: http://www-2.cs.cmu.edu/~dst/LispBook/

于 2010-12-15T01:33:09.643 に答える