如果 Common Lisp 中的 atom 和 null 接收一个列表作为参数,它们有什么实际区别吗?

Is there any pratical difference for atom and null in Common Lisp if they receive a list as an argument?

我正在使用 SBCL、Emacs 和 Slime。根据Symbolic Computation: A gentle introduction to Common Lisp一书,atom的定义是:

The ATOM predicate returns T if its input is anything other than a cons cell.

另一方面:

The NULL predicate returns T if its input is NIL. Its behavior is the same as the NOT predicate.

使用 REPL 并以 仅列出 作为参数,我只能想到他们检索相同结果的示例:

CL-USER> (atom (cons 1 nil))
NIL
CL-USER> (null (cons 1 nil))
NIL
CL-USER> (atom (cons 1 (cons 2 nil))) 
NIL
CL-USER> (null (cons 1 (cons 2 nil))) 
NIL
CL-USER> (atom (cons 1 2))
NIL
CL-USER> (null (cons 1 2))
NIL
CL-USER> (atom '())
T
CL-USER> (null '())
T
CL-USER> (null nil) ;; just changing notation from previous
T
CL-USER> (atom nil) ;; just changing notation from previous
T
CL-USER> (atom '(1 . 2)) ;; just changing notation from previous
NIL
CL-USER> (null '(1 . 2)) ;; just changing notation from previous
NIL
CL-USER> (atom '(1 2))  ;; just changing notation from previous
NIL
CL-USER> (null '(1 2))  ;; just changing notation from previous
NIL 
CL-USER> (atom '(1))  ;; just changing notation from previous
NIL
CL-USER> (null '(1))  ;; just changing notation from previous
NIL

根据上面的定义和示例,并考虑到 非空列表是缺点单元格,我得出的结论是:

if the argument is a list, null and atom do have the same behavior as predicates.

这个说法有反例吗?我错过了什么?正确吗?

列表是:

  • 空列表,() aka nil,这不是缺点;
  • 或任何对象和列表的缺点。

null return仅对 nil 为真; atom return对于任何不是缺点的对象都是正确的。

因此,当仅限于列表时nullatom return 只对 nil 有效,是唯一既是列表又不是缺点的对象,对于列表,是等价的谓词。