首页 > 解决方案 > 在 cond 中省略括号会导致奇怪的结果

问题描述

考虑以下代码段

(define (f a b c)    
   (
     cond ((and (< b c) (< b a)) (+ c  a))
          ((and (< a c) (< a b)) (+ c b))
          ((and (< c b) (< c a)) (+ b  a))
   ) 
)

(display (f 2 1 3)) ; 5
(newline)
(display (f 2 8 3)) ; 11
(newline)
(display (f 2 8 -3)) ; 10

现在,如果我从底部评论第二行和第二行

(define (f a b c)    
   ;(
     cond ((and (< b c) (< b a)) (+ c  a))
          ((and (< a c) (< a b)) (+ c b))
          ((and (< c b) (< c a)) (+ b  a))
   ;) 
)

结果是

#<undef>
11
10

我无法解释为什么省略括号会导致该结果。在第二种情况下,我预计编译器会将cond ((and (< b c) (< b a)) (+ c a)),((and (< a c) (< a b)) (+ c b))((and (< a c) (< a b)) (+ c b))作为三个表达式处理,后两个无效,相反,它们似乎被执行了。

标签: scheme

解决方案


通常cond,关键字在解释时应该引发异常。

但是,如果您的解释器没有抛出任何错误,那么您是在块语句的情况下,其中最后一个表达式的评估提供了结果,其他的仅计算副作用。代码简化为:

(define (f a b c)  ((and (< c b) (< c a)) (+ b  a))))

推荐阅读