-1

私は最近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関数を使用する必要があると思いますが、ツリーでそれらを適切に使用する方法がわかりません。

4

1 に答える 1

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))))))
于 2012-11-24T22:41:30.693 に答える