Разница между экв? а = в схеме? - PullRequest
6 голосов
/ 03 июня 2009
    > (eq? 1 1)
    #t
    > (eq? 1.1 1.1)
    #f
    > (= 1.1 1.1)
    #t

Это окно взаимодействия в DrScheme. Может кто-нибудь объяснить, пожалуйста, разницу между = и eq? в схеме?

Ответы [ 4 ]

9 голосов
/ 03 июня 2009

= сравнивает числа. э? проверяет, представляют ли параметры один и тот же объект данных в памяти. Eqv? должен работать во втором случае, поскольку он тестирует так же, как EQ? но тестирует примитивы специально. Подробнее о предикатах equlivence в схеме здесь .

3 голосов
/ 06 декабря 2011

экв? на числах непредсказуемо. Это зависит от реализации или нет, являются ли числовые литералы разделенными так, чтобы одни и те же числа находились в одном и том же месте в памяти. Например, язык Racket недавно решил интернировать такие литералы во время чтения. http://www.mail-archive.com/dev@racket-lang.org/msg04893.html

Вы не будете знать наверняка, будет ли среда выполнения языковой реализации представлять каждое число уникальным образом. Это может повлиять на значения в штучной упаковке, такие как float и bignums. Вот почему = существует как предикат для чисел: он проверяет равенство содержимого, а не равенство мелких указателей.

Это не относится только к таким языкам, как Scheme: например, равенство и равенство встречаются в Python ( равно против == ).

3 голосов
/ 03 июня 2009

Я бы догадался, что с

экв? оценивается как #f, если его параметры представляют одни и те же данные объект в памяти;

и

Схема хранит неточные цифры (1.1) в отличие от точных чисел (1)

Два аргумента 1.1 не находятся в одном месте в памяти и возвращают #f для уравнения?

Справочник по Википедии

1 голос
/ 03 июня 2009

первое отличие: eq? работает с любой парой значений, а = работает с любым количеством чисел.

Есть несколько других предикатов эквивалентности . Большинство из них принимают только два параметра. = определено в главе «цифры»

...