Common lisp subst if在Common Lisp中的树上抛出错误工作

Common lisp subst if在Common Lisp中的树上抛出错误工作,common-lisp,sbcl,subst,Common Lisp,Sbcl,Subst,为什么我会出现这个错误: 价值 (2 (2 (2 (2 (2) 2) 2) 2) 2) 他不是那种人 数 绑定SB-KERNEL::X时 [类型错误的条件] 使用以下测试功能调用subst if时: (defun 2p (N) (= N 2)) (subst-if 3 #'2p '(2 (2 (2 (2 (2) 2) 2) 2) 2)) 您必须在2p函数中使用equal或eql(或任何可以比较任意值的函数,因为您的情况下eql更快),因为该函数必须能够接收您传递的参数(带子列表的列表)中的任何

为什么我会出现这个错误:

价值 (2 (2 (2 (2 (2) 2) 2) 2) 2) 他不是那种人 数 绑定SB-KERNEL::X时 [类型错误的条件]

使用以下测试功能调用
subst if
时:

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

您必须在
2p
函数中使用
equal
eql
(或任何可以比较任意值的函数,因为您的情况下
eql
更快),因为该函数必须能够接收您传递的参数(带子列表的列表)中的任何值。
=
功能用于数字

(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
*(描述#'=)
#
[编译函数]
Lambda列表:(NUMBER&REST SB-KERNEL::MORE-NUMBERS)
声明类型:(函数(编号和剩余编号)
(布尔值和可选值))
派生类型:(函数(数字和REST T)(布尔值和可选值))
文档:
如果其所有参数在数值上相等,则返回T,否则返回NIL。
已知属性:可折叠、可流动、不安全可流动、可移动、谓词、可交换
源文件:SYS:SRC;代码;NUMBERS.LISP