假设你刚刚有二元表达式“*和” +为运营商来说,很容易编码代数的基本规则,并简化表达式的递归下降。像这样:
(define (simplify exp)
(cond ((number? exp) exp)
((symbol? exp) exp)
((list? exp)
(assert (= 3 (length exp)))
(let ((operator (list-ref exp 0))
(operand-1 (simplify (list-ref exp 1))) ; recurse
(operand-2 (simplify (list-ref exp 2)))) ; recurse
(case operator
((+)
(cond ((and (number? operand-1) (= 0 operand-1)) operand-2)
((and (number? operand-2) (= 0 operand-2)) operand-1)
((and (number? operand-1) (number? operand-2))
(+ operand-1 operand-2))
(else `(,operator ,operand-1 ,operand-2))))
((*)
(cond ((and (number? operand-1) (= 0 operand-1)) 0)
((and (number? operand-2) (= 0 operand-2)) 0)
((and (number? operand-1) (= 1 operand-1)) operand-2)
((and (number? operand-2) (= 1 operand-2)) operand-1)
((and (number? operand-1) (number? operand-2))
(* operand-1 operand-2))
(else `(,operator ,operand-1 ,operand-2))))
(else 'unknown-operator))))
(else 'unknown-expression)))
这仅执行一个传过来的表达。通常你会想要执行通过,直到结果没有改变。
是否应该是?x? – leppie 2013-03-28 13:49:33
这取决于上下文。我从源代码中逐字引用,有时它们使用'?s','?n'等作为变量名,而不是'?x' – 2013-03-28 13:52:26