代码之家  ›  专栏  ›  技术社区  ›  wrongusername

Lisp函数调用错误

  •  4
  • wrongusername  · 技术社区  · 15 年前

    我已经编写了一个这样的Lisp函数:

    (defun power (base exponent)
      (if (= exponent 0)
          1
        (* base (power (- 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.
    

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

    4 回复  |  直到 15 年前
        1
  •  11
  •   Chris Johnsen    15 年前

    递归调用只有一个参数:

    (power (- exponent 1))
    

    应该是这样的:

    (power base (- exponent 1))
    
        2
  •  6
  •   jtdubs    15 年前

    递归调用是您的问题。你忘了把基数作为第一个参数传入。

    (* base (power (- exponent 1)))))

    应该是:

    (* base (power base (- exponent 1)))))

        3
  •  3
  •   Rainer Joswig mmmmmm    15 年前

    编译函数。在LispWorks中,使用c-sh-c在编辑器中编译定义。

    在REPL中:

    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还具有在发生错误的地方定位代码的功能。

        4
  •  1
  •   Gareth Rees    15 年前

    Lisp附带函数 expt ,所以不需要定义自己的。

    (除非这是一个练习或家庭作业,在这种情况下,您可能需要寻找更有效的方法,例如 exponentiation by squaring .)