简单的LISP功能无法正常工作

时间:2010-06-28 02:14:56

标签: lisp common-lisp

我今天决定学习LISP,并且一直在玩它。我写了一个简单的婴儿功能只是为了测试我的理解,现在明白我的理解并不像我理解的那样理解。 :d

无论如何,这是功能。这个想法是,当它被调用时,例如(esexp base x)它应该返回值基数^ 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))))

这不起作用。我得到的错误看起来像(警告:此变量未定义: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))))

3 个答案:

答案 0 :(得分:11)

esexp(base (+ x 1))

应该是

(esexp base (+ x 1))

esexp就像+一样。调用函数的语法是

(function-name arg1 arg2 ...)

答案 1 :(得分:5)

错误的技术解释:编译器正在解析代码:

(/ esexp(base (+ x 1)) base)

这样:

(/ esexp (base (+ x 1)) base)

说:

  • 首先,将1添加到参数x
  • 然后,使用上面的结果调用名为base函数
  • 将名为esexp变量的值除以上述结果。
  • 然后,将该结果除以参数base。 (Common Lisp中的除法运算符可以使用两个以上的参数。)

你看到了诀窍?当一个单词作为s表达式中的第一个项目出现时(并且该表达式未被引用),它通常被视为您要调用的函数的名称。否则,它将被视为要检索其值的变量的名称。此外,在Common Lisp中,esexp之类的符号可以同时绑定到 function 值和 variable 值;上下文或特殊表达式如#'esexp(表示函数)用于确定你的意思。

编译器告诉你,虽然esexpdefun语句绑定到函数,但它尚未绑定到变量< / em>值,因此不能这样使用。因此,错误。

答案 2 :(得分:0)

只是关于代码的说明。我相信它应该是

(defun esexp (base x)
        (if (= x 0)
                1
                (if (< x 0)
                        (/ (esexp(base (+ x 1)) base))
                        (* (esexp(base (- x 1)) base))))

否则该函数永远不会终止。 (你有(* (esexp(base (+ x 1)) base))))