Вопросы схемы и R5RS об эк - PullRequest
       38

Вопросы схемы и R5RS об эк

0 голосов
/ 22 февраля 2020

Можете ли вы объяснить, почему первый ложный, а второй истинный?

А как это работает? Спасибо.

(eq? '(1 2 3) '(1 2 3)) ;False
(eq? '() '()) ;True

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Цитируется из TSPL3 :

[..] Два объекта считаются идентичными, если они внутренне представлены одним и тем же значением указателя [..] Пустой список () идентичен сам по себе, где бы он ни появлялся. [..] Две пары, векторы или строки, созданные различными приложениями cons, vector, string и т. Д. c., Различны.

Если вы пишете вместо

(let ((x '(1 2 3)))
  (eq? x x))

это будет #t.

2 голосов
/ 22 февраля 2020

Есть только один пустой список, поэтому все варианты использования () относятся к этому списку, а он eq? сам по себе. В описании спецификации схемы модели хранения говорится:

Несмотря на это, подразумевается, что пустой список не может быть вновь выделен, поскольку он является уникальным объектом.

и спецификация eqv? (на которую ссылается описание eq?) говорит, что два объекта эквивалентны, если

obj 1 и obj 2 оба являются пустым списком

Но когда вы создаете непустой список, он создает fre sh один раз, и они не eq? друг другу, даже если они содержат одинаковые элементы.

...