我希望如果这是一个家庭作业问题,你看看火星的评论而不是我的回答。如果您只使用我的代码,您将不会做得很好。另一方面,如果您真的通读所有内容并真正理解它,那就是。
正如 Mars 所说,我们需要递归。这很简单;如果我们有一个数字,返回它。
(defun solve (expression)
(if (atom expression)
expression
'havent-dealt-with-this-yet))
[22]> (solve '3)
3
如果我们有一个列表,请采取第二件事,假设它是运算符,然后按照您在示例中所做的方式对其进行评估:
(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
(第三个表达式)中的任何一个都是值;它们本身可能是表达式。但是我们需要弄清楚表达式的值。假设我们有办法获取表达式并找到它的值。那么我们的代码可以是:
(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
达达!