【发布时间】:2016-05-05 01:43:54
【问题描述】:
我有一个基本上可以运行的功能
(cond
(
(cond)
(cond)
)
)
目前方案对我来说似乎是一门外语。我的问题很简单。仅当嵌套也返回 true 时,如何让第一个条件返回 true。从我收集的内容来看,嵌套的 (cond)(cond) 是否被视为第一个正确的测试?我一直得到的只是#void 的回报。
【问题讨论】:
我有一个基本上可以运行的功能
(cond
(
(cond)
(cond)
)
)
目前方案对我来说似乎是一门外语。我的问题很简单。仅当嵌套也返回 true 时,如何让第一个条件返回 true。从我收集的内容来看,嵌套的 (cond)(cond) 是否被视为第一个正确的测试?我一直得到的只是#void 的回报。
【问题讨论】:
像这样:
(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 语句。
【讨论】:
没有理由这样做。想象一下这个例子:
(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 (>= 20 x 10))。
【讨论】: