Scheme / Racket中的Cond语句

时间:2016-09-22 20:41:11

标签: scheme conditional racket

我对cond语句很困惑 -

我想知道如何使用一个cond:

来编写一些内容
(define (name x)
  (cond [(statement 1 is true)
           [(if statement 1 and statement 2 are both true) *print*]
           [(if statement 1 is true and statement 2 is not) *print*]])

  [else (statement 1 is false)
           [(if statement 1 is false and statement 2 is true) *print*]
           [(if statement 1 and statement 2 are both false) *print*]])

(伪条件)

谢谢

2 个答案:

答案 0 :(得分:1)

由于您提及statement-1statement-2,我认为您的代码可以进行大量优化,因为嵌套if已经确定了statement-1的状态。这是我的看法:

(if statement-1
    (if statement-2 ; statement-1 consequent
        consequent-1-2-true
        alternative-1-true-2-false)
    (if statement-2 ; statement-1-alternative
        consequent-1-false-2-true
        alternative-1-2-false))

statement-2只会评估一次,因为statement-1将为false或true。

当你有一个简单的if-elseif时,cond更有用,其中只有替代方法有嵌套ifs。

(cond (predicate-1 consequent-1)
      (predicate-2 consequent-2)
      ...
      (predicate-n consequent-2)
      (else alternative))

现在您可以使用let计算高级语句,并使用and检查多个是否为真:

(let ((result-1 statement-1) (result-2 statement-2))
  (cond ((and result-1 result-2) consequent-1-2-true)
        (result-1 consequent-1-true-2-false) 
        (result-2 consequent-1-false-2-true)
        (else alternative-1-2-false))) 

当然,如果语句本身就是变量并因此被缓存,则不需要let。请注意,第一个之后的测试不需要检查一个是否为真而第二个不是因为我们知道两者都不是真的,那么先前的结果将被触发并且cond已经完成。所有的判断都可以假设所有先前的谓词都是错误的。

编写代码时,最好考虑使代码更易于阅读和理解的原因。在这种情况下,我不会使用cond,因为您的问题的性质甚至嵌套在结果和替代上。

答案 1 :(得分:0)

仅仅是对我的第二个建议(不是答案)的跟进:

(define (name x)
  (if 'statement 1 is true'
      (if 'statement 2 is true'
          *print1*
          *print2*)
      (if 'statement 2 is true'
          *print3*
          *print4*)))

这涵盖了布尔情况。