为什么我会收到此错误:
绑定 SB-KERNEL::X [条件类型 TYPE-ERROR] 时,值 (2 (2 (2 (2 (2) 2) 2) 2) 2) 不是 NUMBER 类型
subst-if
使用以下测试功能调用时:
(defun 2p (N) (= N 2))
(subst-if 3 #'2p '(2 (2 (2 (2 (2) 2) 2) 2) 2))
为什么我会收到此错误:
绑定 SB-KERNEL::X [条件类型 TYPE-ERROR] 时,值 (2 (2 (2 (2 (2) 2) 2) 2) 2) 不是 NUMBER 类型
subst-if
使用以下测试功能调用时:
(defun 2p (N) (= N 2))
(subst-if 3 #'2p '(2 (2 (2 (2 (2) 2) 2) 2) 2))
您必须在函数中使用equal
or 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