An meiner Uni mussten wir mit Racket arbeiten und da es mir irgendwie gefiel, kaufte ich das kürzlich erschienene Buch "Realm Of Racket" von No Starch.Wie funktioniert eq? in Schlägerarbeit?
Es ist so weit, aber ich kann nicht herausfinden, was sie in Kapitel 4 bedeuten, wenn sie versuchen zu erklären, wie eq? Werke:
- Zuerst sie erklären, wie gleich? vergleicht, ob zwei Werte aus identischen Teilen bestehen. OK, kein Problem, ich habe das: gleich? funktioniert praktisch genauso wie Javas equals (someObject) Methode. Wenn zwei Objekte/Strukturen/was auch immer inhaltlich gleich sind, wird #t zurückgegeben.
- Dann dachte ich, eq? muss dem Java-Operator == entsprechen, der nicht inhaltlich, sondern auf Basis von Referenzen vergleicht.
Dieser Gedanke schien durch den folgenden Satz in dem Buch bestätigt: "eq? Vergleicht, ob das Ändern einer Struktur ändert die andere Struktur ..." Großartig! Sagen wir es auf das folgende Java-Code vergleichen:
Point p1 = new Point(5, 5); Point p2 = p1; System.out.println(p1 == p2); // true, since the reference has been copied. System.out.println(p1.x); // 5 System.out.println(p2.x); // 5 p1.x = 42; System.out.println(p1.x); // 42 System.out.println(p2.x); // Accordingly, 42
Lassen Sie uns versuchen, dies in Racket:
(define cons1 (cons 1 empty)) (define cons2 cons1) (eq? cons1 cons2) ;; #t, since the refernce has been copied. (set! cons1 (cons 2 empty)) cons1 ;; Returns '(2) - as expected. cons2 ;; Still returns '(1).
Warum? cons2 verweist auf cons1, die selbst auf '(2) zeigt. Haben sie nicht auch gesagt, dass sie gleich sind, sobald man den anderen ändert?
Offensichtlich jetzt bekomme ich nicht, warum das nicht wie erwartet verhalten, und aus diesem Grunde, ich sehe nicht, was eq? geht. Ich bin vielleicht falsch, und es hat nichts mit Referenzen zu tun hat ...
Wenn jemand davon weiß, geben Sie bitte Ihre Weisheit teilen;)
Die 'eq?' Teile müssen sein, was 'eq?' Garantiert wird. Es gibt viel mehr, die in Wirklichkeit "eq?" Sind, aber wahrscheinlich nicht in der Zukunft garantiert werden, wie: '(eq? (+ 4 5) (+ 5 4)) ==> # t',' (eq? 5e100 5e100) ==> # t', '(eq?" Racketeer "" Racketeer ") ==> # t'. siehe http://docs.racket-lang.org/reference/eval-model.html#%28part._model-eq%29 – Sylwester