Recursion 简单的LISP代码赢得';无法捕捉输入错误
我正在为递归阶乘函数编写一个非常简单的lisp代码。当使用数字调用时,它工作正常。但是,当我尝试使用非数字(例如a)呼叫它时,我得到以下错误: 错误:尝试获取未绑定变量“A”的值。 [条件类型:未绑定变量] 然而,这应该在我的代码中被捕获。这是我的密码:Recursion 简单的LISP代码赢得';无法捕捉输入错误,recursion,error-handling,lisp,factorial,Recursion,Error Handling,Lisp,Factorial,我正在为递归阶乘函数编写一个非常简单的lisp代码。当使用数字调用时,它工作正常。但是,当我尝试使用非数字(例如a)呼叫它时,我得到以下错误: 错误:尝试获取未绑定变量“A”的值。 [条件类型:未绑定变量] 然而,这应该在我的代码中被捕获。这是我的密码: (defun FactorialRec (num) (cond ((not(numberp num)) (p
(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))))
)
)
(defun FactorialRec(num)
(续)
((不是(数字))
(princ“参数必须是数字。”)
(i)
())
((等于数字1);基本情况
1)
((
它在我的机器上工作。所以我认为你传递的是A
,而不是“A”
?在调用函数之前发生错误。在Lisp解释器中键入函数调用表达式时,它首先计算所有参数并调用函数。如果使用未绑定的变量,则参数计算失败。不要将参数类型检查混入主逻辑。使用在进入函数时,或在函数的早期方便时,检查类型
宏:
(defun factorial (num)
(check-type num (and integer (satisfies plusp)))
(if (= num 1)
1
(* (factorial (1- num)) num)))
表单(和整数(满足plusp))
是一个类型表达式。Lisp类型可以与和
之类的运算符联接,并且满足
类型运算符可以用于从任何谓词函数创建类型。因此,我们可以指定一个类型,其域值为整数,且为正的对象。检查类型
将很高兴地验证我们的变量以查看它是否属于此类型
我还使用了内置的
1-
函数,它从参数中减去一,而不是(-num 1)
。这个1-
是一个符号,不是特殊的语法。谢谢,我仍然习惯于编写和运行lisp,这样粗心的事情会发生。所以,a永远不能在lisp中计算?@amaliat21,我想Barmar已经很好地介绍了它:)谢谢!我发现了我的问题。
(defun factorial (num)
(check-type num (and integer (satisfies plusp)))
(if (= num 1)
1
(* (factorial (1- num)) num)))