鉴于这些定义:
(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)
我该如何完成?
答案 0 :(得分:1)
您需要将f
(cond
表达式)的主体替换为匹配参数替换的参数。
答案 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