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

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

0 голосов
/ 27 марта 2019

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

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

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

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

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

1 Ответ

2 голосов
/ 28 марта 2019
  • 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?, хотя это не гарантируется в отчете.

...