【问题标题】:Symbol’s value as variable is void: false when run element-of-setpSymbol 作为变量的值是 void:运行 element-of-setp 时为 false
【发布时间】:2023-04-10 10:14:01
【问题描述】:

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

有什么问题?

【问题讨论】:

  • 没有false,而是有nil()
  • 错误可能是微不足道的,帮助不是。可以请转发评论回答。 @picklerick
  • 我相信你确实知道这一点,但 SICP 是为 Scheme 编写的,而不是 Emacs Lisp,两种语言之间存在显着差异。你不应该期望一个代码在另一个中工作。

标签: variables emacs scheme


【解决方案1】:

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

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

如果您尝试改为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多