Reu 发表于 2022-7-6 07:00:02

'if progn#039;与&#

将“if”与“progn”一起使用而不是简单地使用“cond”是否有逻辑上的原因?

MSasu 发表于 2022-7-6 07:06:35

我要说的是一个代码人机工程学的问题;当需要测试单个条件(简单或多个,它与AND和/或组合)和相应的操作时,它使代码更具可读性。
当然,COND是一个非常强大的语句,这是许多高级编程语言所缺乏的。

BlackBox 发表于 2022-7-6 07:09:22

... 当然
 
当必须根据IF语句的测试表达式的结果执行“this”(又名“then”)或“that”(又名“else”)时,IF很有用。
 
然而,当您需要测试多个场景时,COND可能会有所帮助。。。只要准备好返回Nil(子列表中的最后一个表达式)的可能性,如果none prior是非Nil。
 
给定IF语句的上下文,只有当想要在“then”或“else”表达式中对两个或多个表达式进行分组时,才需要PROGN。
 
HTH公司

Reu 发表于 2022-7-6 07:14:08

 
因此,如果我对“progn”语法的理解是正确的,那么可以设置一个代码来测试“then”和“else”表达式中的多个表达式?有点像多个“and”语句?
 
(if (this is true)
(progn
   (do these things)
)
(progn
   (else do these things)
)
)

BlackBox 发表于 2022-7-6 07:19:43

 
FTFY公司
 
 
不AND函数要求所有表达式返回非Nil,而PROGN不返回。

Lee Roy 发表于 2022-7-6 07:24:01

为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语句的任何内容。出于某种原因,我更容易理解。

MSasu 发表于 2022-7-6 07:24:07

也许通过在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))
)
)

Lee Mac 发表于 2022-7-6 07:29:35

下面是关于这个话题的另一个很好的解释:
 
http://www.theswamp.org/index.php?topic=13046.msg158557#msg158557

BIGAL 发表于 2022-7-6 07:33:29

重复v的foreach呢?类似问题

Lee Mac 发表于 2022-7-6 07:39:12

 
完全取决于应用程序;有时重复更合适,有时重复更合适。
当迭代列表项时,foreach几乎总是最合适的;然而,当使用索引进行迭代时,或当多次重复操作时,将使用repeat。正如我所说,这取决于应用程序,没有“一刀切”的答案。
页: [1] 2
查看完整版本: 'if progn#039;与&#