2013-05-22 33 views
0

我該如何編寫一個計劃程序來進行常規和。在方案2 + 2中寫入(+ 2 2)。我必須做的程序應該使(2 + 2)成爲可能。計劃中的常規加法或乘法運算符

+2

你的問題進行了詳細幾乎完全缺乏。你能更準確地描述你想要做什麼嗎? –

回答

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

正是我想要的和更多。我不認爲我對那些懂計劃的人聽不清楚。如果只有我在這之前幾個小時才能得到A-,那麼在課程中= /。你如何獎勵我對這個新手點。 – Eerian

0

假設你想計劃的前綴符號轉換成中間符號:

(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)) 
+0

足夠接近但不是真的。不過謝謝 – Eerian