2016-10-05 92 views
0

根據這些定義:評估球拍表達

(define s 8) 
(define p (/ s 2)) 
(define (f s p) 
     (cond [(or (> s 0) p) 'yes] [(< s 0) 'no])) 

我要評估這個表達式:

(f 0 (and (< s p) (> s 2))) 

到目前爲止,我有:

 ⇒ (f 0 (and (< 8 p) (> s 2))) 
     ⇒ (f 0 (and (< 8 4) (> s 2))) 
     ⇒ (f 0 (and false (> s 2))) 
     ⇒ (f 0 false) 

如何完成這個?

回答

1

您需要將其替換爲fcond表達式)的主體,並將參數替換爲其匹配參數。

+0

如果我寫0,而不是COND – kaminey

+0

程序不接受什麼讓你覺得你應該更換' cond'與0? –

+0

@ScottHunter:我認爲很明顯kaminey不理解你的答案。我明白你的遲疑只是給他/她作業的完整答案,但是也許你可以組成一個不同的函數來演示你的「用f的身體替換它」過程? – ruakh

0

球拍看到該f是一個過程,並評估它的參數:

(f 0 (and (< s p) (> s 2))) ; ==> 
(f 0 (and (< 8 4) (> 8 2))) ; ==> 
(f 0 (and #f #t))   ; ==> 
(f 0 #f)     ; s=0, p=#f 

然後,參數代入變量在身體的f

; ==> 
(cond [(or (> 0 0) #f) 'yes] 
     [(< 0 0) 'no]) 

因爲兩者(or (> 0 0) #f)(< 0 0)#f結果是實現選擇的未定義值。在球拍是#<void>

; ==> 
#<void> 

這本來是可以避免總是有一個else項:

(define (f s p) 
    (cond [(or (> s 0) p) 'yes] 
     [(< s 0) 'no] 
     [else 'banana])) 

(f 0 (and (< s p) (> s 2))) ; ==> banana