Значение символа в качестве переменной равно void: false при запуске element-of-setp - PullRequest
0 голосов
/ 31 октября 2019

Следуя инструкциям 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  

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

1 Ответ

1 голос
/ 31 октября 2019

Однако само по себе element-of-setp, похоже, работает правильно:

К сожалению, использованный вами тест не охватил все возможные случаи.

Если выпопробуйте вместо этого:

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

Затем функция достигнет случая, когда список пуст, и в этом случае она будет оценивать false, что, скорее всего, не определено;как указано в комментарии, логические значения в Emacs-Lisp представлены nil и не- nil значениями (атомами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...