'if progn#039;与
将“if”与“progn”一起使用而不是简单地使用“cond”是否有逻辑上的原因? 我要说的是一个代码人机工程学的问题;当需要测试单个条件(简单或多个,它与AND和/或组合)和相应的操作时,它使代码更具可读性。当然,COND是一个非常强大的语句,这是许多高级编程语言所缺乏的。 ... 当然
当必须根据IF语句的测试表达式的结果执行“this”(又名“then”)或“that”(又名“else”)时,IF很有用。
然而,当您需要测试多个场景时,COND可能会有所帮助。。。只要准备好返回Nil(子列表中的最后一个表达式)的可能性,如果none prior是非Nil。
给定IF语句的上下文,只有当想要在“then”或“else”表达式中对两个或多个表达式进行分组时,才需要PROGN。
HTH公司
因此,如果我对“progn”语法的理解是正确的,那么可以设置一个代码来测试“then”和“else”表达式中的多个表达式?有点像多个“and”语句?
(if (this is true)
(progn
(do these things)
)
(progn
(else do these things)
)
)
FTFY公司
不AND函数要求所有表达式返回非Nil,而PROGN不返回。 为If/Then/Else剥皮的两种方法
使用“(if)”
(if (<IF this is true>)
(progn
(<THEN do this>)
(<and this>)
(<and this>)
)
(progn
(<ELSE do this>)
(<and this>)
(<and this>)
)
)
使用“(cond(t))”
(cond ((<IF this is true>)
(<THEN do this>)
(<and this>)
(<and this>)
)
(t
(<ELSE do this>)
(<and this>)
(<and this>)
)
)
我个人更喜欢将“(if)”用于单个表达式then/else语句,将“(cond(t))用于需要多个then/else语句的任何内容。出于某种原因,我更容易理解。 也许通过在VLISP控制台中测试以下代码节选可以帮助您更好地理解:
测试评估为真:
(if (= 1 1)
"This is true!"
"This isn't true!"
)测试评估为假:
(if (= 1 0)
"This is true!"
"This isn't true!"
)
测试评估为true,因此逐个评估第一个分支上的表达式,并返回最后一个评估的结果:
(if (= 1 1)
(progn
(setq a (+ 1 1))
(setq a (+ a 1))
)
(progn
(setq a (- 1 1))
(setq a (- a 1))
)
)测试评估为假,因此逐个评估第二个分支上的表达,并返回最后一个评估的结果:
(if (= 1 0)
(progn
(setq a (+ 1 1))
(setq a (+ a 1))
)
(progn
(setq a (- 1 1))
(setq a (- a 1))
)
) 下面是关于这个话题的另一个很好的解释:
http://www.theswamp.org/index.php?topic=13046.msg158557#msg158557 重复v的foreach呢?类似问题
完全取决于应用程序;有时重复更合适,有时重复更合适。
当迭代列表项时,foreach几乎总是最合适的;然而,当使用索引进行迭代时,或当多次重复操作时,将使用repeat。正如我所说,这取决于应用程序,没有“一刀切”的答案。
页:
[1]
2