我被要求解释具有特定输入的函数的输出,但我不明白该函数的工作原理。它被认为是if的新版本,但对我来说它看起来根本没有任何作用。
(define (if-2 a b c)
(cond (a b)
(else c)))
对我而言,这看起来总是会打印b但我不确定。
答案 0 :(得分:3)
您似乎不熟悉cond
表单。它的工作原理如下:
(cond
((<predicate1> <args>) <actions>)
;^^-- this form evaluates to true or false.
; If true, we do <actions>, if not we move on to the next predicate.
((<predicate2> <args>) <actions>) ; We can have however many predicates we wish
(else ;<-- else is always true. This is our catch-all.
<actions>))
以下是重命名了一些变量的代码。
(define (if-2 predicate arg1 arg2)
(cond
(predicate arg1)
(else arg2)))
要弄清楚为什么它总是为你的测试返回arg1
,请回想一下,除了显式的错误符号(通常为#f
)和空列表'()
之外,Scheme会将所有内容视为真。
因此,当您致电(if-2 > 2 3)
时,cond表格会对此进行评估:
(cond
(> 2)
;^---- `>` is not the empty list, so it evals to #t
(else 3))
然后,因为cond
返回它发现与真值相关联的第一件事,你得到2回。
要使if-2
按预期工作,您需要以不同方式调用它,例如(if-2 (> 3 2) 'yep! 'nope!)
将返回'yep!
,因为3大于2.