在Racket满足条件后退出条件声明

时间:2014-01-21 05:56:37

标签: racket

我有条件陈述,例如:

(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'可以摆脱循环。

2 个答案:

答案 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(这是多余的,因为它不会产生任何副作用),那么它的值就是结果。