Разница между экв.? а = в схеме?

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

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


person unj2    schedule 02.06.2009    source источник
comment
более интересный вопрос - это различия между eq?, equal? и eqv?   -  person newacct    schedule 06.12.2011


Ответы (4)


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

person JP Alioto    schedule 02.06.2009

Я бы предположил, что с тех пор

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

а также

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

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

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

person cmsjr    schedule 02.06.2009

eq? для чисел непредсказуемо. Это зависит от реализации или нет, будут ли числовые литералы захоронены, чтобы одни и те же числа находились в одном и том же месте в памяти. Язык Racket, например, недавно решил интернировать такие литералы во время чтения. http://www.mail-archive.com/[email protected]/msg04893.html

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

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

person dyoo    schedule 05.12.2011

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

есть несколько других предикатов эквивалентности . Большинство из них принимают ровно два параметра. = определяется в 'numbers' глава

person Javier    schedule 02.06.2009