Scheme 省略cond中的括号会导致奇怪的结果
考虑以下代码段Scheme 省略cond中的括号会导致奇怪的结果,scheme,Scheme,考虑以下代码段 (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 (
(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
(定义(f a b c)
(
条件((和(
现在如果我评论第二行和底部的第二行
(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))
;)
)
(定义(f a b c)
;(
条件((和(
结果是
#<undef>
11
10
#
11
10
我无法解释为什么省略括号会导致这样的结果。在第二种情况下,我希望编译器将
cond((和(
,((和(
和((和(
视为三个表达式,后两个表达式无效,相反,它们似乎被执行了。通常cond
关键字在解释时会引发异常
但是,如果您的解释器没有抛出任何错误,那么您的情况就是block语句,在block语句中,最后一个表达式的求值提供了结果,其他表达式只计算副作用。代码简化为:
(define (f a b c) ((and (< c b) (< c a)) (+ b a))))
(定义(f a b c)((和(
我们不知道您运行的是哪个方案版本,但我的方案版本会抛出一个错误,没有括号的孤独的cond
会导致立即的cond:cond中的语法错误。我使用了名为BiwaScheme解释器版本0.6.4
中的一个。谢谢,现在它似乎不是一个好的解释器,它永远都不是有效的代码,因为(and(<…)(<…)
是#t
或#f
,而不是一个函数。@tfb(and…)一直都是布尔值?不,您不在这里的#C…@allinsure(and…
可能不是布尔值,但(and(<…)(<…)
是,因为(<…)
总是返回布尔值。这就是为什么我在我的评论中明确指出了这一点。我不知道C中的规则是什么。@tfb((和(