Okay, gehen wir Schritt für Schritt durch Ihr Programm. Ich vergebe auch eindeutige Nummern (denke an sie als Objektadressen, wenn du an C-ähnliche Sprachen gewöhnt bist) für jedes neu erstellte Objekt, damit du sehen kannst, was was ist. :-)
(define x (list 1 2 3)) ; => #1 = (1 . #2), #2 = (2 . #3), #3 = (3 .())
(define y (list 4 5)) ; => #4 = (4 . #5), #5 = (5 .())
(define z (cons (car x) (cdr y))) ; => #6 = (1 . #5)
(define w (append y z)) ; => #7 = (4 . #8), #8 = (5 . #6)
(define v (cons (cdr x) (cdr y))) ; => #9 = (#2 . #5)
(set-car! x 6) ; => #1 = (6 . #2)
(set-car! y 7) ; => #4 = (7 . #5)
(set-cdr! (cdr x) (list 8)) ; => #2 = (2 . #10), #10 = (8 .())
Nun lassen Sie uns auf Ihre Werte aussehen (für jede Referenz, die zuletzt zugewiesene Wert verwenden):
x ; #1 => (6 . #2) => (6 . (2 . #10)) => (6 2 8)
y ; #4 => (7 . #5) => (7 5)
z ; #6 => (1 . #5) => (1 5)
w ; #7 => (4 . #8) => (4 . (5 . #6)) => (4 . (5 . (1 . #5))) => (4 5 1 5)
v ; #9 => (#2 . #5) => ((2 . #10) 5) => ((2 8) 5)
Edit: Ich bin ein Diagramm Hinzufügen meine erklären Antwort, da Sie keine Diagramme in einem Kommentar haben können. Ich habe keine Zeit, ein Diagramm zu erstellen, das die obigen Werte zeigt, aber das erklärt hoffentlich ein paar Dinge.
Jedes Paar hat zwei "Slots", car
und cdr
, wie die linke und rechte Kästen in dem Diagramm oben dargestellt. Jeder dieser Schlitze, wie Sie sehen, hat drei mögliche Dinge:
- ein Atom (eine Zahl in Ihren Beispielen oder Symbole in dem Diagramm, wie
let
, s5
und sqrt
)
- Ein Verweis (im Diagramm)
- Null (dargestellt als Blackbox in dem Diagramm als Pfeil dargestellt)
Sie irgendwelche dieser in einem der Slots setzen können. Also, in meiner obigen Erklärung, jedes der #
Elemente ist ein Pfeil, jede der #
Zahlen ist ein Atom, und jeder der ()
ist eine Black Box.Also, in der Linie
(define v (cons (cdr x) (cdr y)))
Sie ein Paar erstellen, wo der linke Schlitz hat den gleichen Inhalt wie der rechten Schlitz x
(dh ein Pfeil nach 2 paaren) und dem Recht -Hand-Slot hat den gleichen Inhalt wie der rechte Slot von y
(ein Pfeil geht zu Paar 5). Mit anderen Worten enthalten beide Felder in v
Pfeile, von denen jedes ein anderes Paar ablegt.
Hope das macht mehr Sinn. :-)
Können Sie mehr zu V? Warum gilt für Z Rückgabewerte (# 6), aber Nachteile von (cdr x) (cdr y) (# 9) sind immer noch an zwei Referenzen gebunden? – UberJumper
Sowohl z als auch v sind definiert als die Nachteile von zwei bestehenden Werten; aber das Auto von z ist eine Zahl (unveränderlicher Wert), während das Auto von v eine Cons-Zelle ist (veränderbarer Wert, geteilt). Set-Auto! und set-cdr! Modifizieren Sie die Zellen, nicht die Werte, die sie enthalten. – Javier
+1 für das Diagramm. Was hast du benutzt, um das zu machen? –