common lisp 一个判断列表是否只有一个对象的函数
写法一:
(defun one1p (lst) (and (not (cdr lst)) (not (null lst))))
解说:列表只有一个对象,否定它,那就是列表不是一个对象,即列表有0个对象或列表有多个对象。
列表不是 0 个对象: (not (null lst))
列表不是多个对象:(not (cdr lst))
当以上两个条件都满足,则列表只有一个对象。
写法二:
(defun one2p (lst) (not (or (cdr lst) (null lst))))
解说:这个是写法一的变体。写法一中用到了两个 not,由逻辑表达式: !A and !B == !(A or B) ,补A和补B的交集 等于 对 A 和 B 的并集 取补。
这样就完成了对写法一的稍微的一点简化。这个技巧我觉得是必须掌握的,以为这是基础集合的知识。