得到一个;“装订不良”;LISP中的错误

得到一个;“装订不良”;LISP中的错误,lisp,common-lisp,lispworks,Lisp,Common Lisp,Lispworks,我必须用Lisp编写一个简单的程序,将多项式乘以某个因子。在这个例子中,我想乘以(x+5)*5x。答案应该是5x^2+25x 当我输入((11)(50))(51))时,我应该得到(52)(51)。然而,我遇到了各种各样的错误,从(TERM)中的未定义的运算符TERM到糟糕的绑定形式。我是Lisp的新手,试图返回一个列表,如上图所示。下面是我的一小段代码: (defun get-coef (term) (car term)) (defun get-power (term) (cadr t

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

当我输入
((11)(50))(51))
时,我应该得到
(52)(51)
。然而,我遇到了各种各样的错误,从(TERM)中的
未定义的运算符TERM到
糟糕的绑定形式。
我是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))))))

感谢您的帮助

您的代码有几个问题:

  • 您正在使用
    (fun(arg1 arg2))
    语法。它应该是
    (有趣的arg1 arg2)
    。例如,您编写了
    (make term(coef power))
    ,但它应该是
    (make term coef power)

  • 您在
    let
    中的绑定到处都是。正确的语法是

    (let ((v1 e1)
          (v2 e2)
          (v3 e3))
      e0)
    
    i、 所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(
    e1
    等)没有包装在任何额外的括号层中

  • make term
    get power
    使用的表示法不同。在
    get power
    中,您使用
    cadr
    ,因此需要确保
    make term
    power
    置于正确的位置

  • 您的
    poly eval
    实际上并没有将
    (make term coef power)
    与递归调用
    (poly eval(cdr poly)factor)
    相结合,因此它会丢失。您应该
    cons
    将“这里”结果转换为“那里”结果

  • 您的
    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))))))
    
    给予,给予

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

    ((5 2) (25 1))
    

    您的代码有几个问题:

  • 您正在使用
    (fun(arg1 arg2))
    语法。它应该是
    (有趣的arg1 arg2)
    。例如,您编写了
    (make term(coef power))
    ,但它应该是
    (make term coef power)

  • 您在
    let
    中的绑定到处都是。正确的语法是

    (let ((v1 e1)
          (v2 e2)
          (v3 e3))
      e0)
    
    i、 所有绑定都在一个列表中,每个绑定都是两个元素的列表。请注意,变量绑定到的表达式(
    e1
    等)没有包装在任何额外的括号层中

  • make term
    get power
    使用的表示法不同。在
    get power
    中,您使用
    cadr
    ,因此需要确保
    make term
    power
    置于正确的位置

  • 您的
    poly eval
    实际上并没有将
    (make term coef power)
    与递归调用
    (poly eval(cdr poly)factor)
    相结合,因此它会丢失。您应该
    cons
    将“这里”结果转换为“那里”结果

  • 您的
    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))))))
    
    给予,给予

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

    ((5 2) (25 1))
    

    你的make术语使用CONS,但你的get power使用CADR:

    (得权(期限)(cadr期限))

    (如有必要,请指定条款(coef power)(cons coef power))

    你可能想要(列出coefpower)

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

    现在,您的get动力用于CDR的汽车CADR,但CDR是'p'

    你的输入是系数和功率的列表,例如(51),所以看起来唯一的问题是你的制造术语


    或者,您也可以转身与((5.1)(5.0)保持一致,然后将get power更改为be(cdr术语)。

    您的make术语使用CONS,但get power使用CADR:

    (得权(期限)(cadr期限))

    (如有必要,请指定条款(coef power)(cons coef power))

    你可能想要(列出coefpower)

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

    现在,您的get动力用于CDR的汽车CADR,但CDR是'p'

    你的输入是系数和功率的列表,例如(51),所以看起来唯一的问题是你的制造术语

    或者,您可以转过身来,与((5.1)(5.0)保持一致,然后将get power更改为(cdr术语)。

    另一种方式:

    (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)))))
    
    • 注:第一个=汽车,其余=cdr,第二个=cadr
    另一种方式:

    (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)))))
    
    • 注:第一个=汽车,其余=cdr,第二个=cadr