评估球拍表达

时间:2016-10-05 00:36:51

标签: racket

鉴于这些定义:

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

我该如何完成?

2 个答案:

答案 0 :(得分:1)

您需要将fcond表达式)的主体替换为匹配参数替换的参数。

答案 1 :(得分:0)

Racket认为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