【问题标题】:How to write scheme cond so it returns the value of a nested cond如何编写方案 cond 使其返回嵌套 cond 的值
【发布时间】:2016-05-05 01:43:54
【问题描述】:

我有一个基本上可以运行的功能

(cond
    (
    (cond)
    (cond)
    )
)

目前方案对我来说似乎是一门外语。我的问题很简单。仅当嵌套也返回 true 时,如何让第一个条件返回 true。从我收集的内容来看,嵌套的 (cond)(cond) 是否被视为第一个正确的测试?我一直得到的只是#void 的回报。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    像这样:

    (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
    

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

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

    【讨论】:

      【解决方案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)并使用 if 作为条件为一个谓词。例如。您可以将上面的子conds 之一写到:

      (cond ((>= 20 x 10) #f)
            (else #t))
      

      现在我会自动从 cond 更改为 if,因为它不再需要 cond

      (if (>= 20 x 10)
          #f
          #t)
      

      也许是一个不好的例子,因为整个if 可以写成(not (&gt;= 20 x 10))

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 2018-12-16
        • 2012-09-10
        • 1970-01-01
        • 2011-05-01
        • 2016-11-01
        • 1970-01-01
        • 2014-11-15
        相关资源
        最近更新 更多