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

1 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))))))
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!!

Cac*_*tus 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)
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. make-term不使用相同的表示get-power.在get-power你使用中cadr,你需要确保make-term把它power放在正确的位置.

  4. poly-eval实际上并没有(make-term coef power)与递归调用相结合(poly-eval (cdr poly) factor),所以它会丢失.你应该cons"在这里" - 得到"那里" - 结果.

  5. 您的poly-eval返回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))))))
Run Code Online (Sandbox Code Playgroud)

给予例如

(poly-eval '((1 1) (5 0)) '(5 1))
Run Code Online (Sandbox Code Playgroud)

导致

((5 2) (25 1))
Run Code Online (Sandbox Code Playgroud)