В Paul Graham's book ANSI Common Lisp, обсуждая символ против манипуляций со строками, он говоритСимвол равенства
Символы можно сравнить в одном шаге с
eql
...»
(P138). Здесь находятся два случая сравнения символов:
(setq x 3)
3
(setq a 'x)
X
(setq b 'x)
X
(eq a b)
T
Так, так как и точки б к тому же объекту символ, названный X, они eq
Однако. , Это контрастирует с
(setq a (copy-symbol 'x))
#:X
(setq b (copy-symbol 'x))
#:X
(symbol-name a)
"X"
(symbol-name b)
"X"
(eq a b)
NIL
(eql a b)
NIL
(equal a b)
NIL
(equalp a b)
NIL
Теперь, а и б указывают на различные объекты символа, даже если они имеют один и тот же символ-имя и то же имя для печати. Мои вопросы:
- почему Грэм сказал
eql
, а неeq
и - во втором случае, почему а и б не по крайней мере
equalp
?
EQ или EQL не делает никакой разницы при сравнении символов. copy-symbol возвращает новый, неинтерминированный символ. Таким образом, символы, созданные символом copy, не являются чем-то равным. Они всегда разные. –
@Rainer Joswig Спасибо, что обратили мое внимание на то, что 'copy-symbol' не ставит символ. Как же использовать символ '(copy-symbol 'x t)' для копирования всех символьных функций X (кроме 'symbol-name') на другой интернированный символ Y? Или вам нужно сначала создать интернированный символ, а затем «setf» каждую функцию отдельно? – davypough
'Как использовать один экземпляр (copy-symbol 'xt) для копирования всех символьных функций X (кроме имени-символа) на другой интернированный символ?' -> вы можете ставить новый и скопированный символ в другой пакет , –