私の大学では、Racket を使用する必要がありました。私はそれが好きだったので、最近出版された本「Realm Of Racket」を No Starch から購入しました。
ここまでは素晴らしいのですが、第 4 章でどのようにeq? 作品:
- 最初に、彼らはどのように等しいかを説明しますか?2 つの値が同一の部分で構成されているかどうかを比較します。OK、問題ありません。わかりました:等しいですか? Java のequals(someObject)メソッドとほとんど同じことを行います。2 つのオブジェクト/構造体/内容が同じである場合、#t が返されます。
- それから、私は考えました。Java の==演算子と同等である必要があります。これは内容ごとに比較するのではなく、参照に基づいて比較します。
この考えは、本の中の次の文によって確認されたようです: "eq? は、1 つの構造を変更すると、他の構造が変更されるかどうかを比較します..."素晴らしい! 次の Java コードと比較してみましょう。
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
ラケットでこれを試してみましょう:
(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).
なんで?cons2 は cons1 を指し、cons1 自体は '(2) を指します。また、一方が他方を変更するとすぐに同等であると言っただけではありませんか。
明らかに、今のところ、これが期待どおりに動作しない理由がわかりません。そのため、どの式が表示されませんか? やっています。多分私は間違っていて、参照とは何の関係もありません...
誰かがこれについて知っているなら、あなたの知恵を共有してください;)