eq?
- равенство указателей (символ, логическое значение, пустой список) eqv?
- #t
для всего, что eq?
и того же примитивного значения (число, символ) equal?
- это #t
для всего, что является eqv?
и значения, которые выглядят одинаково
cdr
- это средство доступа.(cdr l)
вернет тот же указатель и, следовательно, (eq? (cdr l) (cdr l)) ; ==> #t
, а также eqv?
и equal?
, поскольку они гарантированно #t
, когда предикат равенства нижнего уровня равен.
Обратите внимание, что это не наоборот.например.(equal? "test" "test"); ==> #t
, но (eqv? "test" "test")
может быть либо #f
, либо #t
.Причиной такого поведения является то, что вы повторно используете постоянные данные, когда читаете код, а не создаете новые.
Распространено хранить примитивные значения в указателе.Например.на 64-битной машине последние 3 бита всегда равны 0, поскольку мы обращаемся к выровненным словам.Реализация схемы обычно тогда кодирует 0-7, чтобы указать тип, и часто, когда он равен 0, остальные биты вообще не местоположение, а число, встроенное в указатель.Таким образом, вы можете получить список (1 2 3)
, который использует 6 слов.3 пары по 2 слова в каждой, но для чисел, которые соответствуют размеру 61 бита, не используется память.Вот почему цифры и символы часто равны eq?
, хотя это не гарантируется в отчете.