我是Lisp的新手,我需要一些帮助。我需要简化下一个表达式:从(+ (+ A B) C)
到(+ A B C)
并从(- (- A B) C)
到(- A B C)
。
如果您可以帮助其中之一,我将理解我需要如何处理下一个。
非常感谢。
[假设您有一个与此模式(+ e1 ... en)
匹配的输入,您要递归地将所有e1
简化为en
,从而得到s1
,...,sn
,然后提取所有以si
开头的+
将其参数上移一个级别,到您要构建的简化表达式。
e
,则表达式(and (consp e) (eq '+ (car e)))
与上述模式匹配。ei
只是由(cdr e)
的列表给出。(+)
的情况,如何简化?f
应用于值列表,请调用(mapcar #'f list)
。根据谓词p
将一个列表分为两个列表,您可以使用循环:
(let ((sat nil) (unsat nil))
(dolist (x list (values sat unsat))
(if (funcall predicate x)
(push x sat)
(push x unsat))))
有一种纯粹的功能编写方式,您能弄清楚吗?