subst-if выдает ошибку работы с деревом в Common Lisp - PullRequest
1 голос
/ 05 октября 2019

Почему я получаю эту ошибку:

Значение (2 (2 (2 (2 (2) 2) 2) 2) 2) 2) не относится к типу NUMBER при связывании SB-KERNEL:: X [Условие типа TYPE-ERROR]

при вызове subst-if с последующей функцией тестирования:

(defun 2p (N) (= N 2))
(subst-if 3 #'2p '(2 (2 (2 (2 (2) 2) 2) 2) 2))

1 Ответ

2 голосов
/ 05 октября 2019

Вы должны использовать equal или eql (или любую функцию, которая может сравнивать произвольные значения, для вашего случая eql быстрее) в функции 2p, так как функция должна иметь возможность принимать любыезначение внутри передаваемого аргумента (список с подсписками). Функция = предназначена для чисел.

(defun 2p (N) (eql N 2))

Определение для =:

* (describe #'=)
#<FUNCTION =>
  [compiled function]


Lambda-list: (NUMBER &REST SB-KERNEL::MORE-NUMBERS)
Declared type: (FUNCTION (NUMBER &REST NUMBER)
                (VALUES BOOLEAN &OPTIONAL))
Derived type: (FUNCTION (NUMBER &REST T) (VALUES BOOLEAN &OPTIONAL))
Documentation:
  Return T if all of its arguments are numerically equal, NIL otherwise.
Known attributes: foldable, flushable, unsafely-flushable, movable, predicate, commutative
Source file: SYS:SRC;CODE;NUMBERS.LISP
...