乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 94|回复: 15

[编程交流] 'if progn#039;与&#

[复制链接]
Reu

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 07:00:02 | 显示全部楼层 |阅读模式
将“if”与“progn”一起使用而不是简单地使用“cond”是否有逻辑上的原因?
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:06:35 | 显示全部楼层
我要说的是一个代码人机工程学的问题;当需要测试单个条件(简单或多个,它与AND和/或组合)和相应的操作时,它使代码更具可读性。
当然,COND是一个非常强大的语句,这是许多高级编程语言所缺乏的。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

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

使用道具 举报

Reu

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 07:14:08 | 显示全部楼层
 
因此,如果我对“progn”语法的理解是正确的,那么可以设置一个代码来测试“then”和“else”表达式中的多个表达式?有点像多个“and”语句?
 
  1. (if (this is true)
  2. (progn
  3.    (do these things)
  4. )
  5. (progn
  6.    (else do these things)
  7. )
  8. )
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:19:43 | 显示全部楼层
 
FTFY公司
 
 
不AND函数要求所有表达式返回非Nil,而PROGN不返回。
回复

使用道具 举报

12

主题

179

帖子

167

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 07:24:01 | 显示全部楼层
为If/Then/Else剥皮的两种方法
 
使用“(if)”
  1. (if (<IF this is true>)
  2. (progn
  3.    (<THEN do this>)
  4.    (<and this>)
  5.    (<and this>)
  6. )
  7. (progn
  8.    (<ELSE do this>)
  9.    (<and this>)
  10.    (<and this>)
  11. )
  12. )

 
使用“(cond(t))”
  1. (cond ((<IF this is true>)
  2.       (<THEN do this>)
  3.       (<and this>)
  4.       (<and this>)
  5.      )
  6.      (t  
  7.       (<ELSE do this>)
  8.       (<and this>)
  9.       (<and this>)
  10.      )
  11. )

 
我个人更喜欢将“(if)”用于单个表达式then/else语句,将“(cond(t))用于需要多个then/else语句的任何内容。出于某种原因,我更容易理解。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:24:07 | 显示全部楼层
也许通过在VLISP控制台中测试以下代码节选可以帮助您更好地理解:
 
测试评估为真:
  1. (if (= 1 1)
  2. "This is true!"
  3. "This isn't true!"
  4. )
测试评估为假:
  1. (if (= 1 0)
  2. "This is true!"
  3. "This isn't true!"
  4. )

 
测试评估为true,因此逐个评估第一个分支上的表达式,并返回最后一个评估的结果:
  1. (if (= 1 1)
  2. (progn
  3. (setq a (+ 1 1))
  4. (setq a (+ a 1))
  5. )
  6. (progn
  7. (setq a (- 1 1))
  8. (setq a (- a 1))
  9. )
  10. )
测试评估为假,因此逐个评估第二个分支上的表达,并返回最后一个评估的结果:
  1. (if (= 1 0)
  2. (progn
  3. (setq a (+ 1 1))
  4. (setq a (+ a 1))
  5. )
  6. (progn
  7. (setq a (- 1 1))
  8. (setq a (- a 1))
  9. )
  10. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:29:35 | 显示全部楼层
下面是关于这个话题的另一个很好的解释:
 
http://www.theswamp.org/index.php?topic=13046.msg158557#msg158557
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 07:33:29 | 显示全部楼层
重复v的foreach呢?类似问题
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:39:12 | 显示全部楼层
 
完全取决于应用程序;有时重复更合适,有时重复更合适。
当迭代列表项时,foreach几乎总是最合适的;然而,当使用索引进行迭代时,或当多次重复操作时,将使用repeat。正如我所说,这取决于应用程序,没有“一刀切”的答案。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 10:42 , Processed in 0.540420 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表