6
    > (eq? 1 1)
    #t
    > (eq? 1.1 1.1)
    #f
    > (= 1.1 1.1)
    #t

これは DrScheme の対話ウィンドウです。= と eq の違いを誰か説明してくれませんか? スキームで?

4

4 に答える 4

9

= 数値を比較します。等?パラメータがメモリ内の同じデータ オブジェクトを表しているかどうかをテストします。同等?eq と同じようにテストするため、2 番目のケースで機能するはずです。ただし、プリミティブを特別にテストします。 スキームの等価述語の詳細については、こちらを参照してください

于 2009-06-02T20:56:34.633 に答える
3

それ以来、私はそれを推測するでしょう

等?パラメータがメモリ内の同じデータ オブジェクトを表している場合を除き、 #f に評価されます。

スキームは、正確な数 (1) とは異なる方法で不正確な数 (1.1) を格納します。

2 つの 1.1 引数はメモリ内の同じ場所に存在せず、eq? に対して #f を返します。

ウィキペディア参照

于 2009-06-02T20:56:35.820 に答える
3

等?数字については予測不可能です。同じ数値がメモリ内の同じ場所にあるように数値リテラルがインターレッドされるかどうかは、実装次第です。たとえば、Racket 言語は最近、読み取り中にそのようなリテラルをインターンすることを選択しました。 http://www.mail-archive.com/dev@racket-lang.org/msg04893.html

言語実装のランタイムが各数値を一意に表すかどうかはわかりません。これは、float や bignum などのボックス化された値に影響を与える可能性があります。=が数値の述語として存在するのはそのためです。浅いポインターの等価性ではなく、コンテンツの等価性をチェックします。

これは、Scheme のような言語に限ったことではありません。たとえば、同等性と同等性は Python で発生します ( is== )。

于 2011-12-05T22:00:09.447 に答える
1

最初の違い:eq?値の任意のペアで機能します=が、任意の数の数値で機能します。

他にもいくつかの等価述語があります。それらのほとんどは、正確に 2 つのパラメーターのみを受け入れます。 「数字」の章=で定義されています

于 2009-06-02T20:52:55.483 に答える