【问题标题】: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)
【解决方案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 作为函数调用吗?