2012-03-01 83 views
1

我看到了下面的代碼:(缺點(車L)(CDR L))不一樣的L,當L不是空的?

#lang r5rs 
(define ma-liste-1 (list 2 3 4 5)) 
(define ma-liste-2 (list 6 7 8 9)) 

(define (cons! e L) 
    (set-cdr! L (cons (car L) (cdr L))) 
    (set-car! L e)) 

(cons! 1 ma-liste-1) 
ma-liste-1 ; (list 1 2 3 4 5) 

我只是不明白,爲什麼下面的代碼不工作:

#lang r5rs 
(define ma-liste-1 (list 2 3 4 5)) 
(define ma-liste-2 (list 6 7 8 9)) 

(define (cons! e L) 
    (set-cdr! L L) 
    (set-car! L e)) 

(cons! 1 ma-liste-1) 
ma-liste-1 ; #0=(mcons 1 #0#) 

誰能幫助?

回答

4
(set-cdr! L L) 

產生cons細胞,其cdr引用本身圓,ASCII領域

.-> (CAR . CDR) 
/  /
\___________/ 

(set-cdr! L (cons (car L) (cdr L)))第一重構cdr使得沒有循環引用。

1

你是被迫進行復制,否則你可以看到,你最終變異現有列表,並最終使其成爲一個圓形列表(符號用於這種共享結構)。