これが宿題の質問である場合は、私の回答ではなく、火星のコメントを見てください. 私のコードをそのまま受け取っても、うまくいきません。一方で、実際にすべてを読んで本当に理解できれば、それはそれで素晴らしいことです。
火星が言ったように、再帰する必要があります。とても簡単です。番号がある場合は、それを返します。
(defun solve (expression)
(if (atom expression)
expression
'havent-dealt-with-this-yet))
[22]> (solve '3)
3
リストを取得した場合は、2 番目のものを取り、それが演算子であると想定して、サンプルで行った方法で評価します。
(defun solve (expression)
(if (atom expression)
expression
(eval (list (second expression)
(first expression)
(third expression)))))
[25]> (solve 3)
3
[26]> (solve '(3 + 4))
7
涼しい。しかし、ここでは元のコードに過ぎません。ネストされた式がある場合はどうなりますか?
[27]> (solve '(3 + (2 * 2)))
*** - EVAL: 2 is not a function name; try using a symbol instead
うーん、これはうまくいきません。(first expression) or
(3 番目の式)`のいずれかが値であると仮定することはできません。それらは式そのものである可能性があります。しかし、式の値を把握する必要があります。式を取得してその値を見つける方法があると仮定しましょう。次に、コードは次のようになります。
(defun solve (expression)
(if (atom expression)
expression
(eval (list (second expression)
(find-expression-value (first expression))
(find-expression-value (third expression))))))
待って!solve
式を取り、その値を見つける関数です!
(defun solve (expression)
(if (atom expression)
expression
(eval (list (second expression)
(solve (first expression))
(solve (third expression))))))
[43]> (solve 3)
3
[44]> (solve '(3 + 2))
5
[45]> (solve '((3 + 1) * (6 / 2)))
12
タダ!