2009-06-02 8 views
6
> (eq? 1 1) 
    #t 
    > (eq? 1.1 1.1) 
    #f 
    > (= 1.1 1.1) 
    #t 

これはDrSchemeにおける対話ウィンドウです。誰かが=とeqの違いを説明できますか?スキームで?eq?スキームでは?

+4

より興味深い質問は '?'、 '?等しいEQ'との違いである、と '当量?' – newacct

答えて

9

=で定義されている数値を比較します。 eq?パラメータがメモリ内の同じデータオブジェクトを表すかどうかをテストします。 eqv? eqと同じようにテストするので、2番目のケースで動作するはずですか?特にプリミティブをテストします。 More on equlivence predicates in scheme here

1

第1差分:数字の任意の数の=機能するが、値の任意の対で動作eq?

他のいくつかのequivalence predicatesがあります。それらのほとんどは、ちょうど2つのパラメータを受け入れます。 ='numbers' chapter

3

私は以来、

EQことを推測するのでしょうか? のパラメータが同じデータを表す場合を除いて#fと評価されます。 オブジェクトがメモリにあります。

異なり、正確な数字から

スキーム店不正確な数字(1.1) (1)

2つの1.1の引数は、メモリ内の同じ場所に存在し、#を返しません。 eのためのf?

Wikipedia Reference

3

EQ?番号のは予測できません。同じ数字がメモリ内の同じ場所にあるように、数値リテラルがインターレースされているかどうかは、実装に依存します。例えば、ラケット言語は、最近、読解中にそのようなリテラルをインターンにすることを選択しました。 http://www.mail-archive.com/[email protected]/msg04893.html

あなたの言語の実装のランタイムは一意の数を表すかどうかを確実に知ることができません。これは、浮動小数点数やbignumのようなボックス化された値に影響します。そのため、数字の述語として=が存在します。これは、浅いポインタの等価性ではなく、コンテンツの等価性をチェックします。

これは、スキームのような言語に排他的ではありません。equalness対平等は、例えば(==です)Pythonで起こります。