乐筑天下

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

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

[复制链接]

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 07:42:05 | 显示全部楼层
谢谢李。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 07:44:26 | 显示全部楼层
如果/条件
AFAICT if只是为了可读性。正如Lee Roy在第6篇文章中所示,if可以通过cond实现。这只是一个语义问题。实际上,if在大多数编程语言中是一个派生函数,可以通过使用GoTo指令(在更类似C的语言中)或通过cond结构(在更类似Lisp的语言中)。
 
但这并不是说所有语言都有相同的结构。E、 你可以比较VB的,如果。。。其他。。。其他。。。Else结构转换为cond,但它不是完全等价的,因为Lisp返回最后一个求值的语句。这使得cond更加强大,例如:
在VB/C*/Pascal等中,至少需要一个临时变量来执行相同的想法,因为即使是VB的If-Then。。。其他。。。Else结构不会像lisp的cond那样返回最后一个值。
 
AutoLisp中“缺少”一件事,相当于VB的select case语句。它的工作原理很像cond,但由于其工作原理,可以更好地进行优化。这背后的原因是select对特定值进行操作,然后将该值与一组指令相关联。因此,它可以一次完成测试,并立即“知道”要运行代码的哪一部分——如果可能的话,减少测试。不过,通过lisp进行自己的学习并非不可能。例如。
不像VB select那样优雅,但如果Autolisp像其他LISP一样有宏/fexpr,它可能看起来完全一样,甚至更好。不需要报价。
 
重复/ForEach/MapCar/While
正如李所指出的,这是一个场景需要什么的问题。如果我必须从单个列表中依次使用每个项目,我通常使用foreach。MapCar一次可以处理多个列表,因此有时这比foreach更好,尽管它的主要目的是将一个或多个列表修改为包含计算项的新列表。重复只是一个指定次数的循环,你在里面做什么取决于你自己。与while类似,只有现在循环每次迭代时才测试条件,而不是像repeat一样只测试一次(如果您在内部所做的是改变条件,则可能是好的,如果条件可以事先计算出来,则可能是坏的,从而使其效率低于可能的效率)。
 
您可以在mapcar中执行与在foreach中相同的操作,在某些情况下还可以在repeat/while中执行。通常使用mapcar/foreach迭代一个或多个列表。但是你会使用repeat/while做一些事情很多次,或者直到某些条件失败。E、 g.假设你想制作一个10个项目的列表,每个项目编号为0到9:
你可以用while做同样的事情:
但是在这种情况下,你很难使用foreach/mapcar,除非你已经有一个10项长的列表,例如。
当你试图在不应该使用的地方强制使用某个东西时,看到它变得多么复杂了吗?更糟糕的是,当你试图反过来。假设你想将列表中的每个整数平方,这将是使用mapcar最简单的方法
请注意,foreach现在需要第二个列表变量,而repeat/while需要另一个索引变量?更不用说repeat/while在长列表上可能会变得非常低效,因为第n个函数每次都必须遍历列表才能到达第n个项目。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:51:42 | 显示全部楼层
很好的例子和解释Irneb,做得好。
 
P、 美国:
  1. 13
可以是:
  1. 14
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 07:55:41 | 显示全部楼层
谢谢你的夸奖,感谢你更好地展示了mapcar背后的想法-表示你可以使用两个列表,即使它们是相同的列表
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 07:57:22 | 显示全部楼层
@irneb公司
@李·麦克
 
很好的解释,非常感谢这两个!
 
:拇指支撑:
 
亨里克
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:00:35 | 显示全部楼层
不客气! 
 
实际上,在通用Lisp中似乎已经有了一个称为case的标准实现:http://www.lispworks.com/documentation/HyperSpec/Body/m_case_.htmhttp://en.wikipedia.org/wiki/Switch_statement#Common_Lisp
 
比VB Select Case想法要简单得多。。。更让人想起帕斯卡的案例陈述:http://en.wikipedia.org/wiki/Switch_statement#Pascal
 
绝对没有C的通过开关盒下降的想法复杂:http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_D.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-15 19:00 , Processed in 0.278458 second(s), 62 queries .

© 2020-2025 乐筑天下

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