Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 简单的LISP代码赢得';无法捕捉输入错误_Recursion_Error Handling_Lisp_Factorial - Fatal编程技术网

Recursion 简单的LISP代码赢得';无法捕捉输入错误

Recursion 简单的LISP代码赢得';无法捕捉输入错误,recursion,error-handling,lisp,factorial,Recursion,Error Handling,Lisp,Factorial,我正在为递归阶乘函数编写一个非常简单的lisp代码。当使用数字调用时,它工作正常。但是,当我尝试使用非数字(例如a)呼叫它时,我得到以下错误: 错误:尝试获取未绑定变量“A”的值。 [条件类型:未绑定变量] 然而,这应该在我的代码中被捕获。这是我的密码: (defun FactorialRec (num) (cond ((not(numberp num)) (p

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

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

然而,这应该在我的代码中被捕获。这是我的密码:

(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)))