Списки не атомы , это важная часть здесь.Хотя символы являются атомами, это означает, что когда они одинаковы, они находятся в одной и той же памяти, они похожи на числа и действительно могут рассматриваться как указатели.Символы также не являются изменяемыми, символ foo
подобен числу 3
.
Списки, однако, не являются атомами, два списка или строки векторов с одинаковым содержимым вполне могут находиться в двух разныхместа памяти.
eq?
тесты только на месте памяти.eqv?
проверяет эквивалентность, что является расплывчатым, и это зависит от того, какая реализация, стандарт Схемы, довольно либеральна с этим, он только говорит, что он должен быть по крайней мере надмножеством eq?
в принципе.equal?
на другом конце тестирует структурное равенство и делает это рекурсивно, поэтому это очень дорогая операция, и поэтому символы часто предпочитаются строкам для идентификаторов.
(define l1 (list 1 2 3))
(define l2 (list 1 2 3))
(eq? l1 l2) ; ===> #f in most implementations
(equal? l1 l2) ; ===> #t in all implementations
(eqv? l1 l2) ; ===> #t in some implementations
(define l3 (cdr l1))
(define l4 (cdr l1))
(eq? l3 l4) ; ===> #t, this means that they 'share memory', if you change l3 or l4, l1 will change with it, beware. This is how car and cdr work, they do not copy.
(define l6 (cons 1 l4));
(eq? l1 l6) ; ===> #f again, cons does allocate new memory, but the tails may very well share it, s in this case, l6 does share its tail with all lists except l2 here in memory.
Кроме того, немного терминологии,cons создает пару, это отличается от списка из двух элементов, создает пару (a . b)
, список (a b)
фактически идентичен паре (a . (b . ()))
Кроме того, cons и car и cdrявляются примитивами, реализация, которую вы видите ниже, является демонстрацией в Структура и реализация компьютерных программ , которая показывает, что они не являются строго необходимыми как они, но использование их в качестве примитивов значительно повышает производительность, поэтому лучше не переопределятьВаши минусы, машина и CDR.