Symbol 作为变量的值是 void: false when 运行 element-of-setp

Symbol’s value as variable is void: false when run element-of-setp

按照SICP的说明,我将其交集重写为:

(defun intersection-set (set1 set2)
  (cond ((or (null set1) (null set2)) '())
        ((element-of-setp (car set1) set2)
         (cons (car set1)
               (intersection-set (cdr set1) set2)))
        (t (intersection-set (cdr set1) set2))))
(defun element-of-setp(x set)
  (cond ((null set) false)
        ((equal x (car set)) t)
        (t (element-of-setp x (cdr set)))))
(intersection-set  (list 1 2) (list 2 3 4))

运行 它报告以下错误:

element-of-setp: Symbol’s value as variable is void: false

但是,element-of-setp 本身似乎可以正常工作:

#+begin_src emacs-lisp :tangle yes
(defun element-of-setp(x set)
  (cond ((null set) false)
        ((equal x (car set)) t)
        (t (element-of-setp x (cdr set)))))
(element-of-setp 1 (list 1 2 3))
#+end_src

#+RESULTS:
: t  

有什么问题?

However, element-of-setp on its own seems to work properly:

很遗憾,您使用的测试没有涵盖所有可能的情况。

如果您改为尝试:

(element-of-setp 5 (list 1 2 3))

然后函数将到达列表为空的情况,并且它会计算 false,这很可能是未定义的;如评论中所述,Emacs-Lisp 中的布尔值由 nil 和非 nil 值(原子)表示。