我被要求解释具有特定输入的函数的输出,但我不明白该函数是如何工作的。它应该是 if 的新版本,但在我看来,它似乎什么也没做。
(define (if-2 a b c)
(cond (a b)
(else c)))
对我来说,这看起来总是会打印 b 但我不确定。
我被要求解释具有特定输入的函数的输出,但我不明白该函数是如何工作的。它应该是 if 的新版本,但在我看来,它似乎什么也没做。
(define (if-2 a b c)
(cond (a b)
(else c)))
对我来说,这看起来总是会打印 b 但我不确定。
看来您对表格不熟悉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
您的测试,请回想一下,Scheme 将所有内容都视为真,除了显式的假符号(通常#f
)和空列表'()
。
因此,当您调用(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。