首页 > 解决方案 > Symbol 作为变量的值是 void:运行 element-of-setp 时为 false

问题描述

按照 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  

有什么问题?

标签: variablesemacsscheme

解决方案


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

不幸的是,您使用的测试并未涵盖所有可能的情况。

如果您尝试改为:

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

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


推荐阅读