> (eq? 1 1)
#t
> (eq? 1.1 1.1)
#f
> (= 1.1 1.1)
#t
Это окно взаимодействия в DrScheme. Может кто-нибудь объяснить разницу между = и eq? в схеме?
> (eq? 1 1)
#t
> (eq? 1.1 1.1)
#f
> (= 1.1 1.1)
#t
Это окно взаимодействия в DrScheme. Может кто-нибудь объяснить разницу между = и eq? в схеме?
= сравнивает числа. экв.? проверяет, представляют ли параметры один и тот же объект данных в памяти. экв? должно работать во втором случае, поскольку он проверяет то же самое, что и eq? но тестирует примитивы специально. Подробнее о предикатах эквивалентности в схеме здесь.
Я бы предположил, что с тех пор
экв.? оценивается как #f, если только его параметры не представляют один и тот же объект данных в памяти;
а также
Схема хранит неточные числа (1.1) иначе, чем точные числа (1)
Два аргумента 1.1 не находятся в одном и том же месте в памяти и возвращают #f для eq?
eq? для чисел непредсказуемо. Это зависит от реализации или нет, будут ли числовые литералы захоронены, чтобы одни и те же числа находились в одном и том же месте в памяти. Язык Racket, например, недавно решил интернировать такие литералы во время чтения. http://www.mail-archive.com/[email protected]/msg04893.html
Вы не будете знать наверняка, будет ли среда выполнения вашей языковой реализации представлять каждое число уникальным образом. Это может повлиять на значения, заключенные в рамки, такие как числа с плавающей запятой и большие числа. Вот почему = существует как предикат для чисел: он проверяет равенство содержимого, а не поверхностное равенство указателя.
Это относится не только к таким языкам, как Scheme: равенство и равенство встречаются, например, в Python (is против ==).
первое отличие: eq?
работает с любой парой значений, а =
работает с любым количеством чисел.
есть несколько других предикатов эквивалентности . Большинство из них принимают ровно два параметра. =
определяется в 'numbers' глава
eq?
,equal?
иeqv?
- person newacct   schedule 06.12.2011