在LISP中出现“错误的绑定表单”错误

时间:2016-03-21 02:23:47

标签: lisp common-lisp lispworks

我必须在Lisp中编写一个简单的程序,它将多项式乘以某个因子。在这个例子中,我想乘以(x + 5)* 5x 。答案应该是 5x ^ 2 + 25x

当我加入((1 1) (5 0)) (5 1))时,我应该(5 2) (25 1)。但是,我遇到了各种错误,范围从undefined operator TERM in (TERM)bad binding form.我是Lisp的新手,并尝试返回如上所示的列表。以下是我的简短代码:

(defun get-coef (term)
  (car term))

(defun get-power (term)
  (cadr term))

(defun make-term (coef power)
  (cons coef power))

(defun poly-eval (poly factor)
  (if (null poly) 0
    (let ((term (car poly))
          (let (coef ((* (get-coef(term)) (get-coef(factor)))))
               (power ((+ (cadr(term)) (cadr(factor)))))
               (make-term (coef power))
               (poly-eval (cdr poly) factor))))))

任何帮助表示赞赏!!

3 个答案:

答案 0 :(得分:5)

您的代码有几个问题:

  1. 您正在使用(fun (arg1 arg2))语法。它应该是(fun arg1 arg2)。例如,您编写(make-term (coef power))但它应该是(make-term coef power)

  2. let中的绑定到处都是。正确的语法是

    (let ((v1 e1)
          (v2 e2)
          (v3 e3))
      e0)
    

    即。所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(e1等)不会包含在任何额外的括号中。

  3. make-term并未使用与get-power相同的表示形式。在get-power中,您使用cadr,因此您需要确保make-termpower置于正确的位置。

  4. 您的poly-eval实际上并未将(make-term coef power)(poly-eval (cdr poly) factor)的递归调用合并,因此会丢失。你应该cons"在这里" - 到#34;那里" -result。

  5. 您的poly-eval会返回0而不是空多项式的空列表。

  6. 总而言之,您的代码可以修复为

    (defun get-coef (term)
      (car term))
    
    (defun get-power (term)
      (cadr term))
    
    (defun make-term (coef power)
      (list coef power))
    
    (defun poly-eval (poly factor)
      (if (null poly) nil
        (let ((term (car poly)))
          (let
              ((coef (* (get-coef term) (get-coef factor)))
               (power (+ (get-power term) (get-power factor))))
            (cons (make-term coef power)
                  (poly-eval (cdr poly) factor))))))
    

    给予例如。

    (poly-eval '((1 1) (5 0)) '(5 1))
    

    导致

    ((5 2) (25 1))
    

答案 1 :(得分:1)

你的假期使用CONS,但你的获取权力使用CADR:

  

(defun get-power(term)(cadr term))

     

(defun make-term(coef power)(cons coef power))

你非常想要(列出coef power)。

(cons'c'p)返回(c.p),而不是(c p)。

现在你的获取能力用于CADR,即CDR的CAR,但是CDR是'p。

您的输入是系数和电源的列表,例如(5 1),因此看起来唯一的问题是您的生产期限。

或者你可以转身并与((5.1)(5.0)保持一致,然后改变获得权力(cdr term)。

答案 2 :(得分:0)

另一种方式:

(defun mult(term factor)
  (list (* (first term) (first factor))  (+ (second term) (second factor))))

(defun polyeval(poly factor)
  (cond
     ((null poly) nil)   
     (t (cons (mult (first poly) factor) (polyeval (rest poly) factor)))))
  • 注意:first = car,rest = cdr,second = cadr