【问题标题】:LISP Programming - function that calculates the nodes of a treeLISP 编程 - 计算树节点的函数
【发布时间】:2012-11-12 19:49:07
【问题描述】:

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

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

一棵树的外观示例如下:(* (+ 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 函数,但我只是不确定如何在树上正确使用它们。

【问题讨论】:

    标签: tree lisp eval common-lisp


    【解决方案1】:
    (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))))))
    

    【讨论】:

    • 感谢您的解决方案,我不太确定它是如何工作的,但我会阅读您使用的功能,希望我能从中学习。再次感谢。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多