Всегда ли cdr списка eqv?

Я пишу интерпретатор для R7RS Scheme, чтобы получить более полное понимание языка программирования Scheme.

Из моего понимания, eqv? должен вернуться #t если оба аргумента списка обозначают одно и то же место в памяти. Тем не менее, я не уверен, если cdr списка всегда должен быть eqv:

(define l '(a b c))
(eqv? (cdr l) (cdr l))  ; #t of #f?

Недостающая часть моих знаний заключается в том, cdr определенного списка всегда должен указывать на конкретное место. Для конкретного списка необходимо cdr всегда возвращать идентичный подсписок каждый раз, когда он вызывается в списке, или он может вернуть совершенно новый подсписок?

(Я понимаю, что я могу проверить это эмпирически, используя существующие интерпретаторы Scheme, но в основном меня интересует, какие стандартные мандаты).

1 ответ

Решение
  • 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? пока не гарантируется в отчете.

Другие вопросы по тегам