0
(defun solve (L)
    (cond
    ((null L) nil)
    (t(eval (list (car (cdr L)) (car L) (car (cdr (cdr L))))))))    

私が持っているコードは、入力が「(5 + 4)」のようなものである限り正常に動作する単純な評価プログラムです。ただし、 '(5 +( 3 - 1))'(6 + 5) - (4 /2 )などの他の入力を解決できるようにしたいと考えています。私の問題は明らかに括弧の扱い方です。'(のリテラル値を ((equal (car L) '( ) (solve(cdr L))) のように比較しようとしましたがそれはすべての右括弧をうまく動かさないだけです。アトムは括弧ですか?

4

1 に答える 1

5

これが宿題の質問である場合は、私の回答ではなく、火星のコメントを見てください. 私のコードをそのまま受け取っても、うまくいきません。一方で、実際にすべてを読んで本当に理解できれば、それはそれで素晴らしいことです。

火星が言ったように、再帰する必要があります。とても簡単です。番号がある場合は、それを返します。

(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

タダ!

于 2013-09-30T05:59:51.740 に答える