0
;;; <- can one use cons to do  ((a . b) . (c . d))?


(define x (cons a b)); nil -- should it be error
(define x (cons 'a 'b)); (a . b)

(define y (cons 'c 'd)); (c . d)

(define z00 (cons x y)) ; (((a . b) c . d) <- cannot use cons to do  ((a . b) . (c . d))?
(define z01 (cons x 'y)) ; ((a . b) . y) 
(define z10 (cons 'x y)) ; (x c . d) 
(define z11 (cons 'x 'y)); (x . y))

(define z (list x y z00 z01 z10 z11)) 
        ; ((a . b) (c . d) ((a . b) c . d) ((a . b) . y) (x c . d) (x . y))

;;; そして、他の手段やドットペアがこのような2番目の要素を持つことができない場合は?

4

3 に答える 3

1

ペアは、コンテンツに基づいて異なる方法で視覚化されます。ペアの に空のリストが含まれている場合、cdrそれは適切なリストであり、ドットと余分な空のリストは表示されません。

(cons 'a '())
'(a . ())
; ==> (a)

そのままのペアを持つペアは、追加の括弧cdrなしでリスト要素として視覚化できます。.

(cons 'b '(a))
'(b . (a))
; ==> (b a)
(cons 'b '(a . c))
'(b . (a . c))
; ==> (b a . c)

これらは、実際にどのように作られているかでは(1 2 3)なく、表示できるように作られているだけです。(1 . (2 . (3 . ())))

にペアまたは空のリストがない場合はcdr、ドット ペアを表示するようにフォールバックします。

(cons 'a 'b)
'(a . b)
; ==> (a . b)

あなたの例'((a . b) . (c . d))では、ドットの後にペアがあるためです(たとえばcdr、ペアの場合、視覚化によりドットと括弧のペアが削除され、 のよう((a . b) c . d)に表示されます。これは、REPL がこれを表示する唯一の正しい方法です。あなたの例と表示は同じ構造として読み込まれます。

数字についても同様の問題があります。コードでは10#xaを使用#o12して数値 10 と値を取得すると、読み込まれた形式がわからず、REPL で基数 10 のみが表示されます。

于 2021-04-19T00:38:44.543 に答える