【发布时间】:2014-10-06 18:39:15
【问题描述】:
我正在尝试编写一个采用多项式并对其进行简化的程序。每次我运行程序时,通过调用“(evalexp'((x 2)(z 8))p1)”我得到错误,“汽车:+不是列表”。它应该返回 "(+ 2 (* 2 (- y 4)))" 这是我的代码:
(setq p1 '(+ x (* x (- y (/ z 2)))))
(setq p2 '(+ (- z 2) (* x 5)))
(setq p3 '(+ 1 a))
(setq p4 '(+ x (+ x (* x 0))))
(defun addexp (e1 e2) (list '+ e1 e2))
(defun subexp (e1 e2) (list '- e1 e2))
(defun mulexp (e1 e2) (list '* e1 e2))
(defun divexp (e1 e2) (list '/ e1 e2))
(defun deep-subst (old new expr)
(cond
((null expr)
nil
)
((listp (car expr))
(cons (deep-subst old new (car expr)) (deep-subst old new (cdr expr)))
)
((eq old (car expr))
(cons new (deep-subst old new (cdr expr)))
)
(T
(cons (car expr) (deep-subst old new (cdr expr)))
)
)
)
(defun subst-bindings (expr bindinglist)
(cond
((null bindinglist)
expr )
(T
(deep-subst (car (car bindinglist)) (car (cdr (car bindinglist)))
(subst-bindings expr (cdr bindinglist))
))))
(defun simplify-triple(op left-arg right-arg)
(cond
((and (numberp left-arg) (numberp right-arg))
(eval (list op left-arg right-arg))
)
((and (eq op '+) (eql right-arg 0))
left-arg
)
((and (eq op '+) (eql left-arg 0))
right-arg
)
((and (eq op '-) (eql right-arg 0))
left-arg
)
((and (eq op '-) (eql right-arg left-arg))
0
)
((and (eq op '*) (eql right-arg 0))
0
)
((and (eq op '*) (eql left-arg 0))
0
)
((and (eq op '*) (eql right-arg 1))
left-arg
)
((and (eq op '*) (eql left-arg 1))
right-arg
)
((and (eq op '/) (eql left-arg 0))
0
)
((and (eq op '/) (eql right-arg 1))
left-arg
)
((and (eq op '/) (eql right-arg left-arg))
1
)
(T
(list op left-arg (simplify right-arg))
;(list op right-arg (simplify left-arg))
)
)
)
(defun simplify (exp)
(cond
( (listp exp)
(simplify-triple (car exp) (simplify (car (cdr exp))) (simplify (car (cdr (cdr exp)))))
)
(T
exp)))
(defun evalexp (exp binding-list)
(simplify (subst-bindings exp binding-list))
)
【问题讨论】:
-
只需跟踪您的函数以了解它是如何将 + 作为输入的,需要使用 whet 列表。
-
这段代码看起来与最近的一个问题非常相似。这是家庭作业或项目的一部分吗? (如果是的话,这不是问题,但一起考虑问题可能会有所帮助。)Lisp Infinite Recursion 的代码格式几乎相同,并以
(evalexp '( (x 2) (z 8) ) p1)行结尾。 -
当您遇到该错误时,您应该能够检查大多数实现中的回溯。这将准确地告诉您对
car的哪个调用有问题,以及在哪里。您应该首先确定这一点。 -
@JoshuaTaylor: gee.cs.oswego.edu/dl/csc344/a2.html
-
供将来参考,这似乎基于 Doug Lea 的 CSC344 课程中的 CSC344 Assignment 2 (Lisp)。
标签: syntax-error lisp