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

标签 tree lisp eval common-lisp

我最近开始学习 lisp 并完成了一些可供我使用的简单练习,不幸的是我被卡住了,而且在花了几个小时之后,我似乎并没有接近一个像样的解决方案。

我正在尝试生成一个函数,该函数将表达式“tree”作为其参数,并返回具有相关计算值的树来代替运算符。

树的示例如下:(* (+ 10 (* 4 9)) (- 6 10))
该函数应返回:(-184 (46 10 (36 4 9)) (-4 6 10))

我尝试了各种方法,但没有任何效果。我创建了一些有效但在编码风格方面非常糟糕的东西,我真的迷失在这里。

(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))))))

关于tree - LISP 编程 - 计算树节点的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546145/

相关文章:

html - 水平 div 树

mysql - 如何正确排序 SQL 中的物化路径?

java - 如何在多树中找到最大的公共(public)子树

python - 值错误: unknown type object pandas eval for n rows => 100

java - SWT/JFace TreeColumn 重新排序 - setMoveable() 问题

list - Lisp:如何停止不需要的多个列表变量的重新分配

tree - 用 Common Lisp 画树

refactoring - Python list-comprehensions 中的 lisp-style style `let` 语法

bash - 为什么 awk 在使用 eval 时打印整行?

r - 使用包中的评估调用包装 data.table