2012-11-24 22 views
-1

我最近開始學習lisp,並完成了一些簡單的練習,可用於我,不幸的是我花了幾小時卡住&似乎我似乎沒有得到任何接近一個體面的解決方案。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函數,但我只是不確定如何在樹上正確使用它們。

回答

2
(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)))))) 
+0

感謝您的解決方案,我不太清楚它的工作原理,但我會閱讀您使用的功能,希望我會從中學習。再次感謝。 – user1850231