如何编写定期汇总的计划程序。在方案2 + 2中写入(+ 2 2)。我必须做的程序应该是(2 + 2)可能是方案。
答案 0 :(得分:2)
你要求一个非常简单的算术表达式求值器。假设唯一支持的运算符是加法,并且两个操作数都是数字(不是其他加法表达式),它就像这样简单:
(define (sum-eval exp)
(match exp
[(list op1 '+ op2) (+ op1 op2)]
[_ exp]))
(sum-eval '(1 + 1))
=> 2
为了使事情变得更有趣,我们可以通过递归计算操作数来允许评估嵌套的子表达式:
(define (sum-eval exp)
(match exp
[(list op1 '+ op2) (+ (sum-eval op1) (sum-eval op2))]
[_ exp]))
(sum-eval '((2 + 3) + (8 + 2)))
=> 15
现在我们就可以了,我们可以为评估者添加更多操作:
(define (mini-eval exp)
(match exp
[(list op1 '* op2) (* (mini-eval op1) (mini-eval op2))]
[(list op1 '+ op2) (+ (mini-eval op1) (mini-eval op2))]
[_ exp]))
(mini-eval '((3 * 3) + (5 * 2)))
=> 19
依此类推,等等 - 你明白了。为读者练习:优雅地处理错误条件。
答案 1 :(得分:0)
假设您要将Scheme的前缀表示法转换为中缀表示法:
(define (prefix->infix form)
(cond ((number? form) form)
((list? form)
(assert (= 3 (length form)))
(let ((operator (list-ref form 0))
(operand1 (prefix->infix (list-ref form 1)))
(operand2 (prefix->infix (list-ref form 2))))
(list operand1 operator operand2)))
(else 'error)))
似乎工作:
> (prefix->infix '(+ 2 2))
(2 + 2)
> (prefix->infix '(+ (- 3 2) (* 5 6)))
((3 - 2) + (5 * 6))