Common Lispで数値式からなる通常の書式(中間記法)の四則演算式を受け取って、
その計算を行う関数を作りたいのですが、四則演算やカッコの優先順位付けに
かなり苦戦しています。一応再帰でカッコを順にはずす関数を作ってはみたんですが・・・

(defun flat (x)
(calc
(cond ((null x) NIL)
((atom x) x)
((atom (car x)) (cons (car x) (flat (cdr x))))
(T (append (flat (car x)) (flat (cdr x))))
)
)
)

実際に計算するcalc関数ができない上、この方法だと実装不可能なような気も。
どなたか別なアプローチで組める方いませんか?
【入力】 【期待する出力結果】
(calculate '(1 + 2)) → 3
(calculate '(1 + 2 * 3)) → 7
(calculate '(1 + 2 * (3 + 2)))→ 11