Tree LISP编程-计算树节点的函数
我最近开始学习lisp并完成了一些简单的练习,但不幸的是我被卡住了&在花了几个小时之后,我似乎没有找到一个合适的解决方案 我试图生成一个函数,该函数以表达式“tree”为参数,返回树,并用相关的计算值代替运算符 一棵树可能是什么样子的一个例子是:Tree LISP编程-计算树节点的函数,tree,lisp,eval,common-lisp,Tree,Lisp,Eval,Common Lisp,我最近开始学习lisp并完成了一些简单的练习,但不幸的是我被卡住了&在花了几个小时之后,我似乎没有找到一个合适的解决方案 我试图生成一个函数,该函数以表达式“tree”为参数,返回树,并用相关的计算值代替运算符 一棵树可能是什么样子的一个例子是:(*(+10(*4 9))(-6 10)) 函数应该返回:(-184(4610(3649))(-4610)) 我试过各种各样的方法,但没有一种方法能奏效。我创造了一些有用的东西,但是在编码风格方面非常糟糕,我真的很迷茫 (defun evalTree (
(*(+10(*4 9))(-6 10))
函数应该返回:
(-184(4610(3649))(-4610))
我试过各种各样的方法,但没有一种方法能奏效。我创造了一些有用的东西,但是在编码风格方面非常糟糕,我真的很迷茫
(defun evalTree (node &optional n)
(when node
(rplaca node (eval node))
(setq n (first (rest node)))
(rplaca n (eval n))
(setq n (first (rest (rest node))))
(rplaca n (eval n))
(setq n (first (rest (rest (first (rest node))))))
(rplaca n (eval n)))
(format t "node=~a n=~a~%" node n)
node)
我认为我的解决方案应该是使用apply函数或eval函数,但我不确定如何在树上正确使用它们。感谢您的解决方案,我不确定它到底是如何工作的,但我将阅读您使用的函数,希望我能从中学习。再次感谢。
(defun eval-tree (tree)
(flet ((arg (a)
(if (atom a) a (first a))))
(if (atom tree)
tree
(destructuring-bind (op a b)
tree
(let ((a1 (eval-tree a))
(b1 (eval-tree b)))
(list (funcall op (arg a1) (arg b1)) a1 b1))))))