如何编写方案cond,以便返回嵌套cond

时间:2016-05-05 01:43:55

标签: scheme racket

我的功能基本上是

(cond
    (
    (cond)
    (cond)
    )
)

目前,计划对我来说似乎是一门外语。我的问题很简单。如果嵌套也返回true,我如何让第一个cond返回true。从我收集的内容来看,嵌套(cond)(cond)被视为第一项权利的测试?我所得到的只是#void以获得回报。

2 个答案:

答案 0 :(得分:3)

像这样:

(cond ((cond ((= 1 2) #f)
             ((= 2 3) #f)
             (else #f))
       #t)
      ((cond ((= 3 4) #f)
             ((= 4 5) #f)
             (else #t)) ; this is the only #t condition
       #t))             ; hence this #t value is returned

在上面的示例中,只有第二个内部else中的最后一个cond返回true,而在最外层cond的条件下,它返回true。

但实际上,你为什么要做这样的事情呢?如果您有多个条件,只需使用单个cond的不同分支。也许你误解了它应该如何使用?将其视为其他编程语言中的一系列if-else if-else if-else语句。

答案 1 :(得分:2)

没有理由这样做。想象一下这个例子:

(cond ((cond ((< x 10) #t)
             ((> x 20) #t)
             (else #f))
       #t)
      ((cond ((< y 10) #t)
             ((> y 20) #t)
             (else #f))
       #t))

这可以很容易地缩减到一个cond

(cond ((< x 10) #t)
      ((> x 20) #t)
      ((< y 10) #t)
      ((> y 20) #t)
      (else #f))

您可以使用or获取第一个真值。这适用于所有真实值,而不只是#t(一切都不是#f被认为是真的)

(or (cond ((< x 10) 'small-x)
          ((> x 20) 'big-x)
          (else #f))
    (cond ((< y 10) 'small-y)
          ((> y 20) 'big-y)
          (else #f)))

即使您可以对每个条件使用cond,但只有在涉及任何副作用或者有多个谓词(如Algol语言中的elseif)并且使用{{1}时才使用它}作为一个谓词的条件。例如。你可以写一个上面的if以上的一个:

cond

现在我会自动从(cond ((>= 20 x 10) #f) (else #t)) 更改为cond,因为它不再是if的nessecary:

cond

可能是一个不好的例子,因为整个(if (>= 20 x 10) #f #t) 可以写成if