Lisp函数调用语法

时间:2013-09-03 10:27:54

标签: lisp syntax-error user-defined-functions

我正在尝试编写一个递归代码来执行x^y,但问题是如何更新代码它会给我一个错误。

守则:

    (defun power(x y) (if(> y 0) (* x (power(x (- y 1)))) (1)))

错误:

CL-USER 11 : 5 >Power 2 3
Error: Undefined operator X in form (X (- Y 1)).

错误:

CL-USER 11 : 5 >power(2 3)
Illegal argument in functor position: 2 in (2 3).

5 个答案:

答案 0 :(得分:13)

你以错误的方式调用函数。在lisps中,函数调用具有以下形式:

(f a b c) 

f(a b c)

您的递归定义中有(power (x (- y 1))),而后者又有(x (- y 1))因此错误:x不是函数。

使用(power x (- y 1)),以便您的定义变为:

(defun power (x y)
   (if (> y 0)
      (* x
           (power x (- y 1))) 
      1))

并将其称为(power 2 3)

答案 1 :(得分:5)

要稍微扩展上一个(正确的)答案,此版本使用一些惯用函数:

(defun power (x y)
  (if (plusp y)
    (* x (power x (1- y)))
    1))

答案 2 :(得分:2)

你不能使用括号进行分组,因为CL认为你想调用函数x和函数1.删除多余的这样:

 (defun power(x y) 
     (if (> y 0) 
         (* x (power x (- y 1)))
         1))

括号在外面,就像你的函数一样:

 (power 2 3) ;==> 8

答案 3 :(得分:1)

当你在Lisp表达式中编写(X ...)时,你断言X是一个要在参数上调用的函数....

你的问题是你的表达中有太多的括号。当你写(电源(x .. 你已经做出了这个断言。写(电源x ......而不是。

答案 4 :(得分:0)

您正在调用此代码:

(power (x (- y 1)))

因此power作为参数调用(x (- y 1))。您确定要将x作为函数调用吗?