Tree LISP编程-计算树节点的函数

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 (

我最近开始学习lisp并完成了一些简单的练习,但不幸的是我被卡住了&在花了几个小时之后,我似乎没有找到一个合适的解决方案

我试图生成一个函数,该函数以表达式“tree”为参数,返回树,并用相关的计算值代替运算符

一棵树可能是什么样子的一个例子是:
(*(+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))))))