1

我正在为递归阶乘函数编写一个非常简单的 lisp 代码。当使用号码调用时,它工作正常。但是,当我尝试使用不是数字的东西(例如 a)来调用它时,我收到以下错误:

错误:尝试获取未绑定变量“A”的值。[条件类型:UNBOUND-VARIABLE]

但是,这应该包含在我的代码中。这是我的代码:

(defun FactorialRec (num)
   (cond                                                  
      ((not(numberp num))
         (princ "Argument must be a number.")
         (terpri)
         ())
      ((equal num 1) ;base case                                                       
         1)
      ((<= 1 num) (* num(FactorialRec (- num 1))))
   )
)

我不知道为什么 numberp 没有抓住这个。有任何想法吗?谢谢。

4

3 回答 3

2

不要将参数类型检查混入您的主要逻辑中。check-type在进入函数时使用宏,或者尽可能早地在函数中使用:

(defun factorial (num)
  (check-type num (and integer (satisfies plusp)))
  (if (= num 1)
     1
     (* (factorial (1- num)) num))) 

表单(and integer (satisfies plusp))是一个类型表达式。Lisp 类型可以与诸如之类and的运算符连接,并且satisfies类型运算符可用于从任何谓词函数中创建类型。所以我们可以指定一个类型,它的域值是整数对象,并且是正数。check-type会很高兴地验证我们的变量,看看它是否属于这种类型。

我还使用了内置1-函数,它从它的参数中减去一个而不是(- num 1). 这1-是一个符号,不是特殊语法。

于 2012-09-23T03:48:16.520 回答
1

该错误发生在您的函数被调用之前。当您在 Lisp 解释器中键入函数调用表达式时,它首先计算所有参数和调用函数。如果您使用未绑定的变量,则参数评估将失败。

于 2012-09-23T03:15:51.413 回答
0
Break 2 [6]> (FactorialRec "A")
Argument must be a number.

它适用于我的机器。所以我认为你是通过A但不是"A"

于 2012-09-23T03:15:30.850 回答