我今天决定学习LISP,并且一直在玩它.我写了一个简单的婴儿功能只是为了测试我的理解,现在明白我的理解并不像我理解的那样理解.:d
无论如何,这是功能.这个想法是,当它被调用时,例如(esexp base x)它应该返回值base ^ x.所以(esexp 3 4)= 3 ^ 4 = 81.
(如果重要的话,我正在使用Common Lisp的CMU实现.)
(defun esexp (base x)
(if (= x 0)
1
(if (< x 0)
(/ esexp (base (+ x 1)) base)
(* esexp (base (+ x 1)) base))))
Run Code Online (Sandbox Code Playgroud)
这不起作用.我得到的错误看起来像(警告:此变量未定义:SLBEXP)和(KERNEL :: UNBOUND-SYMBOL-ERROR-HANDLER中的错误:变量SLBEXP未绑定.)所以.我究竟做错了什么?并且会有更好的(或更多LISP-ish方式)来编写这个函数吗?
ETA
更正代码:
(defun esexp (base x)
(if (= x 0)
1
(if (< x 0)
(/ (esexp base (+ x 1)) base)
(* (esexp base (- x 1)) base))))
Run Code Online (Sandbox Code Playgroud)
sig*_*ice 11
esexp(base (+ x 1))
应该
(esexp base (+ x 1))
esexp
是一个功能就像+
.调用函数的语法是
(function-name arg1 arg2 ...)
Run Code Online (Sandbox Code Playgroud)
错误的技术解释:编译器正在解析代码:
(/ esexp(base (+ x 1)) base)
Run Code Online (Sandbox Code Playgroud)
如下:
(/ esexp (base (+ x 1)) base)
Run Code Online (Sandbox Code Playgroud)
其中说:
x
base
与上面的结果.esexp
.base
.(Common Lisp中的除法运算符可以使用两个以上的参数.)你看到了诀窍?当一个单词作为s表达式中的第一个项目出现时(并且该表达式未被引用),它通常被视为要调用的函数的名称.否则,它将被视为要检索其值的变量的名称.此外,在Common Lisp中,符号esexp
可以同时绑定到函数值和变量值; 上下文或特殊表达式#'esexp
(表示函数)用于确定您的意思.
编译器告诉你,尽管esexp
绑定了一个函数与你的defun
语句,它还没有绑定到一个变量值,因此不能这样使用.因此,错误.
归档时间: |
|
查看次数: |
526 次 |
最近记录: |