(#t #f)在Scheme函数中意味着什么?

时间:2014-10-20 20:24:03

标签: scheme

我从互联网上获取此代码,而我在函数的最后一行中没有得到(#t #f)的含义。请详细说明。

(define (equal? S1 S2)
    (cond ((and (not (pair? S1)) (not (pair? S2))) (eqv? S1 S2))
          ((or (not (pair? S1)) (not (pair? S2))) #f)
          ((equal? (car S1) (car S2)) (equal? (cdr S1) (cdr S2))) 
          (#t #f)))

1 个答案:

答案 0 :(得分:5)

这是对cond陈述的滥用;虽然它在Common Lisp中是惯用的,但在Scheme中,等效和惯用的语法应该是:

(else #f)

这只是一种说法:如果所有其他条件都失败,则返回false。为什么会这样?好吧,在看起来像(#t <anything>)的子句中,始终会评估<anything>表达式,因为条件为真。这就是为什么else应该首先使用,以使意图明确。

此处使用else还有一个额外优势:解释程序强制执行else只能出现在最后一个条件中的限制,而(#t <anything>)可能会出现在任何一点,导致潜在的问题,因为它之后的任何条件都永远不会到达。