在 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))))))
感谢任何帮助!!
您的代码有几个问题:
您正在使用 (fun (arg1 arg2))
语法。应该是(fun arg1 arg2)
。例如,您写 (make-term (coef power))
但它应该是 (make-term coef power)
。
您在 let
中的绑定到处都是。正确的语法是
(let ((v1 e1)
(v2 e2)
(v3 e3))
e0)
即所有绑定都在一个列表中,每个绑定都是一个包含两个元素的列表。请注意,变量绑定到的表达式(e1
等)没有包含在任何额外的括号层中。
make-term
不使用与 get-power
相同的表示。在 get-power
你使用 cadr
所以你需要确保 make-term
把 power
放在正确的位置。
您的 poly-eval
实际上并没有将 (make-term coef power)
与对 (poly-eval (cdr poly) factor)
的递归调用相结合,因此它丢失了。您应该 cons
"here"-结果到 "there"-结果。
您的 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
我必须用 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))))))
感谢任何帮助!!
您的代码有几个问题:
您正在使用
(fun (arg1 arg2))
语法。应该是(fun arg1 arg2)
。例如,您写(make-term (coef power))
但它应该是(make-term coef power)
。您在
let
中的绑定到处都是。正确的语法是(let ((v1 e1) (v2 e2) (v3 e3)) e0)
即所有绑定都在一个列表中,每个绑定都是一个包含两个元素的列表。请注意,变量绑定到的表达式(
e1
等)没有包含在任何额外的括号层中。make-term
不使用与get-power
相同的表示。在get-power
你使用cadr
所以你需要确保make-term
把power
放在正确的位置。您的
poly-eval
实际上并没有将(make-term coef power)
与对(poly-eval (cdr poly) factor)
的递归调用相结合,因此它丢失了。您应该cons
"here"-结果到 "there"-结果。您的
poly-eval
returns0
而不是空多项式的空列表。
总而言之,你的代码可以固定为
(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