element-of-set-p: значение символа в качестве переменной равно void: false - PullRequest
0 голосов
/ 07 января 2020

I mini c a intersction-set операция с sicp

#+name: case-2.3.3-element-of-set-p
#+BEGIN_SRC elisp :session sicp :results value
(defun element-of-set-p(x set)
  (cond ((null set) false)
        ((equal x (car set)) t)
        (t (element-of-setp x (cdr set)))))
(element-of-set-p 1 (list 1 2 3))
#+END_SRC

#+RESULTS: case-2.3.3-element-of-set-p
: t

и набор пересечений

#+BEGIN_SRC elisp :session sicp :results value
(defun intersection-set (set1 set2)
  (cond ((or (null set1) (null set2))
         '())
        ((element-of-set-p (car set1) set2)
         (cons (car set1)
               (intersection-set (cdr set1)
                                 set2)))
        (t (intresection-set (cdr set1)
                                set2))))
(trace-function #'intersection-set)
(intersection-set  (list 1 2) (list 2 3 4))
#+END_SRC

Сообщение об ошибке:

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

В чем проблема?

1 Ответ

1 голос
/ 07 января 2020

У вас есть несколько опечаток в вашем коде:

  • Это не element-of-setp, это element-of-set-p
  • Это не intresection-set, это intersection-set
  • Это не false, это nil

Это должно работать:

(defun element-of-set-p (x set)
  (cond ((null set) nil)
        ((equal x (car set)) t)
        (t (element-of-set-p x (cdr set)))))

(defun intersection-set (set1 set2)
  (cond ((or (null set1) (null set2))
         '())
        ((element-of-set-p (car set1) set2)
         (cons (car set1)
               (intersection-set (cdr set1) set2)))
        (t (intersection-set (cdr set1) set2))))
...