if的新版本,它在做什么?

时间:2012-12-16 21:26:19

标签: if-statement scheme conditional

我被要求解释具有特定输入的函数的输出,但我不明白该函数的工作原理。它被认为是if的新版本,但对我来说它看起来根本没有任何作用。

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

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

1 个答案:

答案 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.