1

为什么我会收到此错误:

绑定 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))
4

1 回答 1

2

您必须在函数中使用equalor 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
于 2019-10-05T09:51:36.163 回答