0

我被要求解释具有特定输入的函数的输出,但我不明白该函数是如何工作的。它应该是 if 的新版本,但在我看来,它似乎什么也没做。

(define (if-2 a b c)
    (cond (a b)
    (else c)))

对我来说,这看起来总是会打印 b 但我不确定。

4

1 回答 1

2

看来您对表格不熟悉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。

于 2012-12-17T02:57:24.937 回答