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个项目。 很好的例子和解释Irneb,做得好。
P、 美国:
13可以是:
14 谢谢你的夸奖,感谢你更好地展示了mapcar背后的想法-表示你可以使用两个列表,即使它们是相同的列表 @irneb公司
@李·麦克
很好的解释,非常感谢这两个!
:拇指支撑:
亨里克 不客气!
实际上,在通用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
页:
1
[2]