我有条件陈述,例如:
(cond
[ (and (null? E1) (not (null? E2))) #f]
[ (and (not (null? E1)) (null? E2)) #f]
[ (or (= (length E1) 1) (= (length E2) 1))
(cond
[ (equal? E1 E2) #t]
[ (equal? (reverse E1) E2) #t]
[ else #f break]
)]
[ .... conditions continue
在达到#f或#t之后是否有退出cond语句的方法,而不是继续到底部,检查所有其他条件?就像在python中一样,有一个'break'可以摆脱循环。
答案 0 :(得分:2)
嗯...如果我理解正确,那么你想要的行为就是内置的行为。这是一个例子:
#lang racket
(define (my-fun E1 E2)
(cond
[(and (null? E1) (not (null? E2))) #f]
[(and (not (null? E1)) (null? E2)) #f]
[(or (= (length E1) 1) (= (length E2) 1))
(cond
[(equal? E1 E2) #t]
[(equal? (reverse E1) E2) #t]
[else #f])] ;; <-- the break was here.
[(dont-run-this-check) #t]
[(dont-run-this-check-either) #f]
[(really-really-dont-run-this-check) #t]))
(my-fun '(a b c) '(d))
(define (dont-run-this-check) (error))
(define (dont-run-this-check-either) (error))
(define (really-really-dont-run-this-check) (error))
评估为#f
在这个例子中,代码在“破坏就在这里”的行上“中断”,并且从不评估以下任何测试(如果确实如此,你会看到一个错误)。那是因为一旦外部'cond'选择了一个子句,其余的都不会被评估。
这就是你要找的东西吗?
答案 1 :(得分:0)
在cond
(cond
(predicate1 consequent1)
(predicate2 consequent2)
(else alternative))
与以下内容相同:
(if predicate1
consequent1
(if predicate2
consequent2
alternative))
因此,如果谓词1与表达式匹配,则consequent1将是整个cond
形式的评估。
如果嵌套cond
,整个cond
的评估将是嵌套cond的谓词匹配时内部的评估。
if
之间的另一个区别是cond
可以有多个结果/替代表达式,因为它有明确的开始..所以你编码你所拥有的地方`
(cond ...
[else #f break])
如果其他谓词不匹配,则始终匹配else
。然后,如果在评估break
之前首先评估#f(这是多余的,因为它不会产生任何副作用),那么它的值就是结果。