(setq arg '(4))
(if (eq arg '(4))
(message "true")
(message "false"))
上面的代码为什么返回false,我认为应该相等啊
(setq arg '(4))
(if (eq arg '(4))
(message "true")
(message "false"))
上面的代码为什么返回false,我认为应该相等啊
因为 eq 测试的是指针,两次 '(4)
生成的列表地址不一样。
比如两个不同地方出现的整数 1 都指向同一个内存地址,eq 测试就为 t,interned symbol 同理。
两个分别构建的 cons cell,可能内容相同,但地址并不是同一个,改变其中一个另一个不受影响,故 eq 测试为假。
Lisp 的列表很早就出现了,所以其实是很贴近硬件底层的设计。
另外可以看下 Equality Predicates - GNU Emacs Lisp Reference Manual - www.gnu.org
不过,你们都是怎么在写代码的区分该用哪个 predicate 的,我经常需要查 info
明白了引用是什么以后就直接理解用法了