【发布时间】:2013-09-30 03:20:50
【问题描述】:
(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))) 进行比较,但这只会抛出我的所有右括号不正常。有没有办法检查原子是否是括号?
【问题讨论】:
-
这在我看来你需要递归。如果您不必使用
cars 和cdrs 的显式链,这也会更容易。有这些组合,例如cadr,它有一个友好的备用名称second。我现在没有时间整理完整的答案,但也许这些提示会很好。 (如果是家庭作业,那就足够了,你应该完成剩下的工作。你的教授不会在没有期望你学会递归的情况下分配这个,所以如有必要,请查看它。如果不是家庭作业,请忽略这些最后的 cmets。 ) -
我再添加一个提示。除非您尝试编写真正的解析器,否则不要显式地处理括号。让 Lisp 处理括号。只需处理给定括号内的内容。
-
@Mars +1 用于有关括号的 cmets。 Shrp91,火星的观点很有道理;
'(5 + (3 - 1))的值是一个列表,其第一个元素是(数字)5,第二个元素是(符号)+,其第三个元素是一个列表,其第一、第二和第三个元素是@987654329 @、(符号)-和1。根本不需要担心括号。但这提出了一个问题,当您说'(6 + 5) - (4 /2 )时,您实际上是在用什么称呼solve?这不是一个单一的表达式,间距很重要:(4 /2)是一个包含元素4和(符号)/2的列表。 -
"... '(5 + (3 - 1)) 的值是一个列表,第一个元素是(数字)5,第二个元素是(符号)+,第三个元素是element 是一个列表,其第一个、第二个和第三个元素是 3、(符号)- 和 1。”这就是我所需要的。出于某种原因,我认为子列表的第一个元素将是括号。完全改变了我处理代码的方式,并在不久后得到它。
标签: lisp common-lisp infix-notation