找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2005|回复: 9

[研讨] 我对AutoLisp的函数的理解

[复制链接]

已领礼包: 6530个

财富等级: 富甲天下

发表于 2013-6-6 10:09:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
各位好!
    以下观点是个人观点,没有接触过,也没有研究过ALisp的核心,只是一个桥梁工程师的通过对ALisp的使用得出的看法,当然也查阅了少量的网上资料,全对是不可能的,希望哪怕只有二三分的正确,也许就能对新手有些帮助。


    闲话少说,还是回头说正题。


    AutoLisp是Lisp的一个分支(或者说是方言),是基于AutoCAD的表结构语言,对Acad实体有很大的操作性,但我们所知道的最大的优点就是,编辑、使用简单。


    网上有一句话:没有一个Lisp程序员是只懂得Lisp语言的。虽然我们不是程序员,但我们或多或少地也都知道点其它语言,而且,先入为主的也是其它的高级语言,于是,ALisp的结构就使得我们那么的不习惯。


    ALisp的所谓函数,说白了,就是被一对括号包住的那些符号和变量的组合,注意,是一对括号,这很重要,同时,根据Lisp的规则,函数本身也可以是变量,这就使函数的嵌套成为可能。


    根据这些年的使用,我对Alisp函数的理解主要有以下几点:


   
1. Alisp程序本身就是一个函数。


    既然是函数,所有的过程也都是在一对括号之中。


    2. 一旦函数被定义,在运行过程中都是等价的。


    不管外部函数还是内部函数,一旦被定义,系统都只是记录这个过程(或者说是数据指针移动过程),与函数的写法不再有关。以后使用时,系统只是复制这个过程,而不再重新解释代码,从这个意义说,对重复运行的代码,以子函数形式表现比重复书写多遍更有效率。


    3. 函数的调用(嵌套)是过程指针的调用,与被调用函数本身不再有关系。


    这一条和上一条是相近的,之所以独立,是想强调一个结构,就是“递归”,递归是Lisp语言的主要结构,car、cdr函数从广义上来说,本身就具有递归的性质,但这里所说的“递归”,是侠义的递归,也就是“自身调用”,自身调用的很难理解的过程,但如果结合上一条和本条来看递归,也就变得简单了,函数“自身调用”,不是调用的函数自身,而是调用被系统记录的这个指针移动过程,换句话说,函数调用的不是“自身”,而是一个和自己完全一样的克隆体,是不是容易理解一点。


    4. AutoLisp的单进程的。


    这句话似乎是不容置疑的,其实对于表结构而言,应该更能适应多进程的算法,但由于单进程的AutoCAD的限制,AutoLisp也只能是单进程的。


    5. ALisp的函数本身就是函数堆叠和嵌套。


    因为函数可以被解释成变量,所以,函数本身可以以变量的方式嵌套函数,也可以作为其它函数的变量,这一点容易看出,但需要注意的是,不管是作为函数还是变量,他们都是被一对括号包围住的,对于单进程而言,这些括号的配对是绝对的。


    6. 函数的嵌套以“后进先出”的规则运行


    这是表结构语言和其它高级语言有很大差异的地方,Lisp语法只有函数调用,没有转移(Goto),任何调用都是一个完整的过程(Exit函数除外),过程结束后自动Return。


    ALisp函数的运行过程我们可以这样描述:程序(函数)就像一个形状不定的容器(气球?),容积是AutoCAD分配的,程序的运行过程就在这个容器里进行,子函数的调用就好像在这个容器里放进另一个同样形状不定的容器,运行过程移到被“调用”的这个容器里,这里的“过程”结束后,我们可以再“调用”另一个容器(子函数),因为是单进程,所以这个“过程”只能有一条线,如果子函数再调用子函数,就像是被嵌套的容器里再放进一个容器,以此类推,可以不断嵌套,但不管怎样嵌套,“线头”只有一个,在从里面的容器里出来之前,是不会到外面的容器里的。每个容器(函数)的操作过程都会有一定的残留(数据或过程描述等),在嵌套另一个容器时都会保留备用,只到程序运行结束。如果这些“残留”超过了容器的总容量,程序就会溢出,这就是“堆栈”溢出的概念,从这个意义,一个结构不良的“递归”,是很容易造成堆栈溢出的。


   
以上就是本人对AutoLisp函数的一些理解,不对之处希望大家指正,总之,如果能对初学者理解AutoLisp有一定帮助,也就不枉本人敲键盘到头昏眼花了。


评分

参与人数 2D豆 +10 贡献 +2 收起 理由
Highflybird + 5 + 1 好主题奖!
xshrimp + 5 + 1 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-6-6 10:19:30 | 显示全部楼层
受教了,虽然一直用 Alisp,但一直上升不到理论层面,惭愧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-6 11:00:47 | 显示全部楼层
受教了,只有帮长老编辑排版了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 13:55:26 | 显示全部楼层
ll兄,用语音输入法啊。手机推荐“讯飞输入法”,一大段文字一会儿就输好,稍作校对就可以了。电脑的还没找到合适的,各位兄弟谁用了的可以推荐。当然,如果有140/min的打字速度就没必要用了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-6 14:05:53 | 显示全部楼层
呵呵,收益匪浅呀。长老,继续
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

 楼主| 发表于 2013-6-7 13:40:13 | 显示全部楼层
欢迎大家指正。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2013-6-10 01:55:22 | 显示全部楼层
老师不愧为ALISP专家,我也很喜欢ALISP,希望能得到您的指点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3256个

财富等级: 富可敌国

发表于 2013-6-11 11:12:00 | 显示全部楼层
楼主都lisp的见解很深入  学习了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2014-2-7 14:11:31 | 显示全部楼层
请大师讲讲

循环方面这个函数的各方面应用示范啊

(WHILE(PROGN
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-2-8 19:22:43 来自手机 | 显示全部楼层
膜拜一下!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-25 02:31 , Processed in 0.436772 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表