在 LISP 中出现 "bad binding form" 错误

Getting a "bad binding form" error in LISP

我必须用 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 的新手,正在尝试 return 如上所示的列表。下面是我的一小段代码:

(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))))))

感谢任何帮助!!

您的代码有几个问题:

  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 "here"-结果到 "there"-结果。

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

总而言之,你的代码可以固定为

(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))

您的 make-term 使用 CONS,但您的 get-power 使用 CADR:

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

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

你很想要(列出系数幂)。

(cons 'c 'p) returns (c . p),不是 (c p)。

现在你得到的权力是 CADR,CDR 的 CAR,但 CDR 是'p。

您的输入是 列表 的系数和幂,例如 (5 1),所以看来唯一的问题是您的 make-term。

或者您可以转身与 (( 5 . 1)(5 . 0) 保持一致,然后将 get power 更改为 (cdr term)。

另一种方式:

(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