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
值(原子)表示。
按照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
值(原子)表示。