2012-03-01 12 views
1

は、私は次のコードを見てきました:(cons(car 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) 

ない循環参照がありませんよう(set-cdr! L (cons (car L) (cdr L)))最初cdrを再構築しながら、そのcdr参照自体円、​​アスキー当

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

cons細胞を産生します。

1

あなたはコピーを作ることを余儀なくされました。そうでないと、既存のリストを突然変異させ、最終的に循環リスト(このような共用構造の表記が使用されます)になります。

関連する問題