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