Вы должны использовать 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