Lisp函数调用错误

Lisp函数调用错误,lisp,function-calls,Lisp,Function Calls,我编写了一个Lisp函数,如下所示: (defun power (base exponent) (if (= exponent 0) 1 (* base (power (- exponent 1))))) (power base (- exponent 1)) 但是,当我尝试调用它时,会出现一些错误: CL-USER 2 > (power 2 3) Error: POWER got 1 arg, wanted at least 2. 1 (abort) R

我编写了一个Lisp函数,如下所示:

(defun power (base exponent)
  (if (= exponent 0)
      1
    (* base (power (- exponent 1)))))
(power base (- exponent 1))
但是,当我尝试调用它时,会出现一些错误:

CL-USER 2 > (power 2 3)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 0.
  2 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 3 : 1 > (power 2)

Error: POWER got 1 arg, wanted at least 2.
  1 (abort) Return to level 1.
  2 Return to debug level 1.
  3 Return to level 0.
  4 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 4 : 2 > (power 2 3 4)

Error: POWER got 3 args, wanted 2.
  1 (continue) Ignore the extra arg.
  2 (abort) Return to level 2.
  3 Return to debug level 2.
  4 Return to level 1.
  5 Return to debug level 1.
  6 Return to level 0.
  7 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.
CL-USER 2>(电源2 3)
错误:电源获得1 arg,至少需要2 arg。
1(中止)返回到级别0。
2返回顶部循环级别0。
键入:b表示回溯,或键入:c表示继续。
键入:错误报告模板的错误表单“”,或:?其他选择。
CL-USER 3:1>(电源2)
错误:电源获得1 arg,至少需要2 arg。
1(中止)返回到级别1。
2返回到调试级别1。
3返回到0级。
4返回顶部循环级别0。
键入:b表示回溯,或键入:c表示继续。
键入:错误报告模板的错误表单“”,或:?其他选择。
CL-USER 4:2>(电源2 3 4)
错误:电源有3个参数,需要2个。
1(继续)忽略额外的参数。
2(中止)返回到2级。
3返回到调试级别2。
4返回一级。
5返回到调试级别1。
6返回到0级。
7返回顶部循环级别0。
键入:b表示回溯,或键入:c表示继续。
键入:错误报告模板的错误表单“”,或:?其他选择。

这是怎么回事?如果我给它两个论点,它会认为我给了它一个。如果我给它三个,它会认为我给了它三个。如果我给它一个,它会认为我给了它一个…

递归调用只有一个参数:

(power (- exponent 1))
应该是这样的:

(defun power (base exponent)
  (if (= exponent 0)
      1
    (* base (power (- exponent 1)))))
(power base (- exponent 1))

递归调用是您的问题。您忘记将base作为第一个参数传入

(*base(幂(-index 1);))

应该是:


(*base(幂基(-exponent 1)())
编译函数。在LispWorks中,使用c-sh-c在编辑器中编译定义

回复如下:

CL-USER 18 > (defun power (base exponent)
               (if (= exponent 0)
                   1
                 (* base (power (- exponent 1)))))
POWER

CL-USER 19 > (compile 'power)
;;;*** Warning in POWER: POWER is called with the
;;;    wrong number of arguments: Got 1 wanted 2
编译器已经告诉您代码有问题


请注意,LispWorks侦听器(REPL)不会编译。您必须使用compile函数编译在侦听器中输入的定义。或者,您可以在编辑器窗口中键入定义并从中编译(通过编译文件、缓冲区或表达式)。LispWorks还具有查找发生错误的代码的功能。

Lisp随函数提供,因此无需定义自己的代码

(除非这是一个练习或家庭作业,在这种情况下,您可能想看看更有效的方法,例如。)