elisp的list用法咨询


#1
(setq arg '(4)) 
    
(if (eq arg '(4))
    (message "true")
  (message "false"))

上面的代码为什么返回false,我认为应该相等啊


#2

因为 eq 测试的是指针,两次 '(4) 生成的列表地址不一样。

比如两个不同地方出现的整数 1 都指向同一个内存地址,eq 测试就为 t,interned symbol 同理。

两个分别构建的 cons cell,可能内容相同,但地址并不是同一个,改变其中一个另一个不受影响,故 eq 测试为假。

Lisp 的列表很早就出现了,所以其实是很贴近硬件底层的设计。


#3

另外可以看下 Equality Predicates - GNU Emacs Lisp Reference Manual - www.gnu.org

不过,你们都是怎么在写代码的区分该用哪个 predicate 的,我经常需要查 info :frowning:


#4

明白了引用是什么以后就直接理解用法了