我从互联网上获取此代码,而我在函数的最后一行中没有得到(#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)))
答案 0 :(得分:5)
这是对cond
陈述的滥用;虽然它在Common Lisp中是惯用的,但在Scheme中,等效和惯用的语法应该是:
(else #f)
这只是一种说法:如果所有其他条件都失败,则返回false。为什么会这样?好吧,在看起来像(#t <anything>)
的子句中,始终会评估<anything>
表达式,因为条件为真。这就是为什么else
应该首先使用,以使意图明确。
此处使用else
还有一个额外优势:解释程序强制执行else
只能出现在最后一个条件中的限制,而(#t <anything>)
可能会出现在任何一点,导致潜在的问题,因为它之后的任何条件都永远不会到达。