【问题标题】:Lisp function call syntaxLisp 函数调用语法
【发布时间】:2013-09-06 13:10:00
【问题描述】:

我正在尝试编写一个递归代码来执行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).

【问题讨论】:

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


    【解决方案1】:

    您不能使用括号进行分组,因为 CL 认为您要调用函数 x 和函数 1。像这样删除多余的部分:

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

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

     (power 2 3) ;==> 8
    

    【讨论】:

      【解决方案2】:

      您以错误的方式调用该函数。在 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)

      【讨论】:

      • else分支中将(1)替换为1,这样就正确了。
      • @TerjeD。很好看!
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        你的问题是你的表达式中有太多的括号。当你写 (power (x .. 你已经做出了这个断言。写 (power x ... 代替。

        【讨论】:

          【解决方案5】:

          除其他外,您正在调用此代码:

          (power (x (- y 1)))
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-13
            相关资源
            最近更新 更多