当前位置:文档之家› 养成良好的AutoLISP书写习惯

养成良好的AutoLISP书写习惯

养成良好的AutoLISP书写习惯众所周知,Lisp是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大费周折,所以,养成一个好的编程习惯是学好Lisp所必须的。

⑴选择一个较好的编辑器,这是一个基本条件,建议使用Visual Lisp编辑器或Lisplink 等专用编辑器,此类编辑器可以对函数突出显示。

⑵按Lisp(DCL)专有格式书写,并经常对程序进行“格式化”,及时发现语法错误,并有利于调试是查找错误。

⑶使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程序条理化。

autolisp的入门教程+autolisp函数!Lisp是一门历史悠久的语言,全名叫LISt Processor,也就是“表处理语言”,它是由John McCarthy于1958年就开始设计的一门语言。

和Lisp同时期甚至更晚出现的许多语言如Algo 等如今大多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了Fortran和COBOL。

但唯独Lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从Lisp分支出来的Scheme、ML等语言在很多场合的火爆程度甚至超过了许多老牌明星。

那么这颗常青树永葆青春的奥秘究竟在哪里呢?如果你只接触过C/C++、Pascal这些“过程式语言”的话,Lisp可能会让你觉得十分不同寻常,首先吸引你眼球(或者说让你觉得混乱的)一定是Lisp程序中异常多的括号,当然从现在的角度来讲,这种设计的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当务之急了。

Lisp的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,别怕,我听你们的),它只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如规则最简单的围棋却有着最为复杂的变化一样,Lisp使用最基本的语言结构定义却可以完成其它语言难于实现的、最复杂的功能。

废话少说,现在我们就来看看Lisp语言中的基本元素。

Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:abc()(abc xyz)(a b (c) d)最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。

正如算数表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。

如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。

正如欧几里德的几何世界中有五个公理一样,我们在这里给出Lisp世界中的7个公理(基本操作符):(quote x)返回x,我们简记为'x(atom x)当x是一个原子或者空表时返回原子t,否则返回空表()。

在Lisp中我们习惯用原子t表示真,而用空表()表示假。

> (atom 'a)t> (atom '(a b c))()> (atom '())t现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用——通过引用(quote)一个表,我们避免它被求值。

一个未被引用的表达式作为自变量,atom将其视为代码,例如:> (atom (atom 'a))t反之一个被引用的表仅仅被视为表> (atom '(atom 'a))()引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用quote来区分它们。

(eq x y)当x和y的值相同或者同为空表时返回t,否则返回空表()> (eq 'a 'a)t> (eq 'a 'b)()> (eq '() '())t例如:我们有时想捕捉任意两点的中点,而不只是一条线上的中点,用系统自己的捕捉中点(它要有辅助线)就不行了,我们可以参考“捕捉虚中点.lsp”程序来实现。

除程序中的语句要学外,动画中的自动找到所有的全局变量并把它们改为局部变量的方法很有用!动画中先画了一个六边形,再画一个圆与它接,圆心就是捕捉虚中点!AutoLisp 概述AutoLisp的数据类型,它有10种数据类型,常见的有五种:整型INT实数型REAL符号型SYM字符串STR表 LISP在AutoLisp中,最基本的数据类型称为符号表达式,也称为S-表达式,它是原子和点对的总称,点对通常表示为表。

原子是一个一般符号系列,有两种类型的原子,一种称为数子原子(简称“数”),AutoLIsp可处理整数和实数,其它不是“数”原子称为非数字原子,它包括符号原子(或称为文字原子)和串原子。

注意:0.4不能写成.4。

符号原子的大小写是等效的。

符号原子可以包含下列字符以外的任何可打印字符。

正反括号用于定义表句号用于作点对分号用于注释的开始‘用作QUOTE函数的简写双引号用作字符串常数的定界符符号原子的长度没有限制,且所有的字符都是有意义的,但尽量不要超过6个字符。

约束是一对符号和值,当将一个值赋给符号时,就说符号被约束到那个值。

值(而不是符号)决定所代表信息的类型,故一个符号可以接受任何类型的值,其初始值为nil.在AutoLisp中,有两个特殊的符号原子,即T和nil.字符串的个数(不包括定界符)称为字符串的长度。

字符串可以是任意长度,它们的存储空间是动态分配的,但字符串常量的最大长度不超过100,长度为0字符串称为空串。

可以用“\nnn”的方式表示字符,其中nnn为八进制。

\e Esc \n 换行\r 回车 \t 制表符(Tab节)点对是由一个左括号,后接一个S-表达式和空格再接一个句点和空格和一个右括号。

表是指放在一对相匹配的左右括号中的元素有序集合。

表中的项称为表的元素,表中的元素可以是任意类型的S-表达式,序号0到n-1。

如果嵌套,0层,1层...表的长度,顶层元素的个数。

只有nil是表(’())又是原子。

表有两种类型:标准表,引用表。

引用表是在表的前面冠以引用符号(’或Quote)对该表不求值。

标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定义,后跟调用该函数的参数。

AutoLisp采用”前缀表示法“即把运算符放在操作数之前,而不是中间,并把运算符(函数名)和操作数(调用函数的参数)用圆括号括起来,以表的方式表示。

一个完整的AutoLisp程序往往是由一系列按顺序排列的S-表达式组成的。

如:(defun plus (x y)(+ ( + x y) x))(SetQ a 2.0)(SetQ b 2.0)(plus a b)一个S-表达式可以分多行写,一行也可以写多个表达式。

注释以分号开始,并在一行的末尾结束,AutoLisp的求值器忽略注释。

AutoLisp是一种求值型语言,求值程序第一次碰到一个求值代码块时,整个块被转换成压宿代码,如果程序中再次碰到那个块,只是简单的运行它。

求值过程:1,整形,实数,字符串,文件指针,系统部函数,以及两个特殊的符号原子,对它们求值就是它们本身。

2,符号原子是以当前的约束值作为它们的求值。

3,表是根据它的第一个元素的数据类型进行求值的。

(1)第一个元素的值为表,该表就假定为用户定义的函数。

(2)如果表的第一个元素的求值结果为一个部函数,则剩余元素作为参数传给该函数,并执行该函数的代码,由函数的类型确定是否对传给它的参数进行求值。

输入距离Lisp语言中输入距离的函数为getdist,但我们有时需要输入负值,有时需要在输入距离的同时得到角度,使用getdist函数就显得无能为力,这时,我们可以灵活使用其它交互输入函数如getpoint、getcorner等,通过计算得到我们所需要的值。

例1是一段输入长度的同时得到默认角度的代码,使用getpoint函数。

************************************************;;例1(setq pt0 (getpoint "\n直线基点: ")pt1 (getpoint pt0 "\n直线长度: ") ;长度及角度可用键盘或鼠标定位dst (distance pt0 pt1) ;计算长度ang (angle pt0 pt1) ;计算默认角度ang1 (getangle pt0 (strcat "\n直线方向<" (angtos ang 1) ">: ")))************************************************例2是可以按阵列方式输入行列间距的代码,输入距离为正值,修改部分代码可输入负值,使用getcorner函数,同时使用initget的控制位128。

************************************************;;例2(defun lc_dist ()(initget 128) ;允许任意输入(setq disr (getpoint "\n指定单位单元或输入行间距: "))(if (= (type disr) 'LIST) ;鼠标输入(progn(initget 1)(setq dis (getcorner disr "\n指定对角点: ") ;鼠标输入对角disc (abs (- (car dis) (car disr))) ;正值行距disr (abs (- (cadr dis) (cadr disr))) ;正值列距) ;计算行列间距)(if (= (type disr) 'STR) ;键盘输入行距(if (setq dis (distof disr)) ;判断输入的是否距离(progn(initget 6)(setq disc (getdist "\n输入列间距: ")) ;输入列距)(progn ;键盘输入格式不符返回(princ "\n需要正数值或两个二维角点。

")(lc_dist)))(progn ;空输入返回(princ "\n需要正数值或两个二维角点。

")(lc_dist)))))AutoCAD中特定角度及长度捕捉的实现方法一、引言在AutoCAD中的角度捕捉只有当正交状态打开时的直和水平方向,对于其他特殊角度无能为力;另外,其网点捕捉也是相对于X轴和Y轴,无法实现其他方向的特殊长度捕捉,给绘图带来极大的不方便。

相关主题