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