Shr*_*p91 0 lisp common-lisp infix-notation
(defun solve (L)
(cond
((null L) nil)
(t(eval (list (car (cdr L)) (car L) (car (cdr (cdr L))))))))
Run Code Online (Sandbox Code Playgroud)
我的代码是一个简单的评估程序,只要输入类似于'(5 + 4),它就可以正常工作.但是我希望能够解决其他输入,例如'(5 +(3 - 1))和'(6 + 5) - (4/2).我的问题显然是如何处理括号.我尝试比较'的文字值'(如((等于(汽车L)'()(求解(cdr L))),但这只会抛出我所有的近似括号.有没有办法检查是否有原子是括号?
我希望如果这是一个家庭作业问题,你看看火星的评论而不是我的回答.如果你只是拿我的代码,你就不会做得好.另一方面,如果你真正阅读所有内容并真正理解它,那就是它.
像火星说的那样,我们需要递归.这很简单; 如果我们有一个号码,请将其归还.
(defun solve (expression)
(if (atom expression)
expression
'havent-dealt-with-this-yet))
[22]> (solve '3)
3
Run Code Online (Sandbox Code Playgroud)
如果我们有一个列表,那就采取第二种方法,假设它是运算符,并按照我们样本中的方式进行评估:
(defun solve (expression)
(if (atom expression)
expression
(eval (list (second expression)
(first expression)
(third expression)))))
[25]> (solve 3)
3
[26]> (solve '(3 + 4))
7
Run Code Online (Sandbox Code Playgroud)
凉.但在这里,我们只是你的原始代码.如果我们有嵌套表达式会发生什么?
[27]> (solve '(3 + (2 * 2)))
*** - EVAL: 2 is not a function name; try using a symbol instead
Run Code Online (Sandbox Code Playgroud)
嗯,这不行.我们不能只假设(first expression) or
(第三个表达式)`中的任何一个是值; 他们可能是表达自己.但我们需要弄清楚表达式的价值.让我们假设我们有办法获取表达式并找到它的值.然后我们的代码可以是:
(defun solve (expression)
(if (atom expression)
expression
(eval (list (second expression)
(find-expression-value (first expression))
(find-expression-value (third expression))))))
Run Code Online (Sandbox Code Playgroud)
等待!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
Run Code Online (Sandbox Code Playgroud)
当当!