我是一位新的lisp程序员,在绕过lisp递归时遇到了麻烦。我有一系列的表达式,我通过一系列用数字替换符号的方法来简化,然后我将评估表达式。在评估之前,我用符号替换数字,这样做会导致我的subst-bindings方法中出现堆栈溢出错误,或者当我从该方法内调用deep-subst方法时。任何关于递归方法调用的帮助或建议可以帮助我更好地理解,我将不胜感激!我的代码是below--Lisp无限递归
(setq p1 '(+ x (* x (- y (/z 2)))))
(setq p2 '(+ (- z 2) (* x 5)))
(setq p3 '(+ 1 a))
(defun deep-subst (old new l)
(cond
((null l)
nil
)
((listp (car l))
(cons (deep-subst old new (car l)) (deep-subst old new (cdr l)))
)
((eq old (car l))
(cons new (deep-subst old new (cdr l)))
)
(T
(cons (car l) (deep-subst old new (cdr l)))
)
)
)
(defun subst-bindings (bindinglist exp)
(cond
((null bindinglist)
exp)
(T
(subst-bindings (cdr bindinglist)(deep-subst (car (car bindinglist)) (cdr (car bindinglist)) exp))
)
)
)
(defun simplify (exp)
(cond
((listp exp)
(simplify-triple (car exp) (simplify (car(cdr exp)))(simplify (car (cdr (cdr exp)))))
(T
exp))))
(defun evalexp (binding-list exp)
(simplify (subst-bindings binding-list exp))
)
(evalexp '((x 2) (z 8)) p1) ;Where I call evalexp from and gives me the stack overflow error
如果您只能显示最少量的代码和重现问题的测试用例以及您收到的错误消息,那将会更有帮助。 Common Lisp还包含一个跟踪宏,因此如果您要执行'(trace deep-subst)',您将看到所有对deep-subst的调用,并且您可能会发现问题。 – 2014-10-01 17:29:31
我会试一试,我也拿出了没有必要的或有助于看到问题的代码。代码的最后一行是一个示例测试用例,我打电话evalexp – Branbron 2014-10-01 17:43:24
我想您可能需要调试更多。这个问题在替代函数中似乎不是*完全*。例如,http://pastebin.com/NWHPK5PF运行没有问题(尽管结果可能不是你期望的结果;如果该绑定列表是“((x。2)(z。8))?”) 。这表明“简化”中的某些内容是错误的。 – 2014-10-01 17:48:37