【问题标题】:Regular addition or multiplication operators in scheme方案中的正则加法或乘法运算符
【发布时间】:2013-05-23 06:55:25
【问题描述】:

我怎样才能编写一个定期求和的方案程序。在方案 2+2 中写入 (+ 2 2)。我必须制作的程序应该使 (2 + 2) 成为可能。

【问题讨论】:

  • 您的问题几乎完全缺乏细节。你能更准确地描述你想要做什么吗?

标签: scheme racket


【解决方案1】:

您需要一个非常简单的算术表达式求值器。假设唯一支持的运算符是加法并且两个操作数都是数字(不是其他加法表达式),它就像这样简单:

(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

等等,等等 - 你明白了。读者练习:优雅地处理错误条件。

【讨论】:

  • 正是我想要的,还有更多。对于知道计划的人来说,我不认为我听起来那么不清楚。如果我能在课程中获得 A- 之前的几个小时得到这个就好了 =/。你如何奖励积分我是新手。
【解决方案2】:

假设你想将 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))

【讨论】:

  • 足够接近但不是真的。不过谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多