AutoLISP程序语言设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
来自百度文库
2. AutoLISP的特点 (1)AutoLISP语言是在普通的LISP语言基础上,又扩充 了许多适用于CAD应用的功能而形成的一种程序设计语言。 它是一种解释性求值语言,速度较慢,难以保密,可用任 何文字编辑软件编辑,用纯文本的格式保存。 (2)AutoLISP语言中的一切成分都是以函数形式给出的, 它没有语句概念或其他语法结构。执行AutoLISP程序就是 执行一些函数,再调用其它函数。 (3)AutoLISP把数据和程序统一表达为表结构,故可把 程序当作数据来处理,也可把数据当作程序来执行。 (4)AutoLISP语言中程序运行过程就是对函数求值的过 程,是在对函数求值的过程中实现函数的功能。 (5)AutoLISP语言的主要控制结构是采用递归方式。递 归方式的使用,使得程序设计简单易懂。
(2)在AutoLISP程序中,一个表达式可以分在多行中写, 也可以一行中写几个。一行由“回车”结束。如前所述,原子 之间多个空格的作用和一个空格的作用相同,都起着分隔符的 作用。如果不考虑打印或印刷限制的话,可以利用多个空格使 程序的结构直观,便于阅读。例如已知函数: (当x 0时) 1 f ( x ) 2 (当x 0时) 0 (当x 0时)
5.2.6 变量
1. 符号:用作变量、函数的名字。 2. 命名规则:不能只含数字,除下列字符以外的任何可 打印字符组成:() . ' ; “” 3. 符号长度无限制,但一般不超过6。 4. 变量的数据类型:不需要事先进行类型说明,变量被 赋予值的类型就为变量的类型。 5. 不能使用内部函数名和关键字作为变量名。 6. 变量赋值:(setq 变量1 值1 [变量2 值2...]) 7. 显示变量的值:!变量名(同时将值传递给autocad)。
(3)在AutoLISP程序中可以用注释。 注释的作用是对程序作解释。例如,题目的名称、算 法及使用方法,各函数的功能及调用参数的数据类型,长表 达式的开始、结束标记等。注释以一个分号“;”开始,并 在一行的末尾结束。注释可以出现在程序的任何地方。注释 应该尽量的多,它并不减慢程序运行,但以后阅读程序或修 改代码时,却能节省大量的时间。
1. 表达式 (1)表达式含义:AutoLISP处理的对象是符号表达式(简 称表达式)。它相当于其它编程语言中的程序语句。 (2)表达式的构成:表达式由原子或表构成。 多数情况下以表的形式存在,例如:(函数名 [变元]…) (3)表达式前缀表示法 大多数计算机语言采用“中缀表示法”来表示程序语句, 如在C语言中,给变量X赋值为25.0,写成如下语句: X=25.0 在该表示法中,运算符“=”放在两个操作数“X”和“25.0” 中间。这种表示法是大家都熟悉的。 在AutoLISP语言中,采用的是“前缀表示法”,即把运算符 放在操作数之前,而不是放在它们的中间,并把运算符(即函数 名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式 表示。如上例,用AutoLISP表示: (setq X 25.0) 运算符(setq)放在操作数(X 25.0)之前。
5.2.3 符号原子 符号原子可以包含除以下字符以外的任何可打印字符: ( ) 用作表的定义; · 用作点对;也是一种表。 ' 用作QUOTE函数的简写; ” 用作字符串常数的定界符; ; 用作程序的注释标志。 符号原子的长度没有限制,但尽量不要超过6个字符,否则要 占用额外的内存,降低运行速度。 在AutoLISP中,符号的大小写是等效的。例如,ABCD, Abcd,abcd,AbcD都表示一个符号原子。 AutoLISP中的任何符号都是有值的,即符号都要赋以一定的 数值,或者说符号总是约束在一定值上。一般用赋值函数setq进 行赋值。 例如:(setq X 25.0) 意思是将25.0赋给x,这时x的当前约束值为25.0一个符号在使用 前如没有赋以任何值,则该符号的值为nil(空),它不占用内存 空间。
AutoLISP平程序语言设计
• • • • • •
AutoLISP程序语言概述 AutoLISP数据类型 AutoLISP程序结构 AutoLISP内部函数 函数定义及装载 AutoLISP程序调试与编程实例
5.1 AutoLISP程序语言概述
1. AutoLISP语言简介 LISP(list processing language)语言是一种计算机的 表处理语言,是在人工智能学科领域中广泛采用的一种 程序设计语言。(Lisp 语言最早是在 20 世纪 50 年代末由 麻省理工学院(MIT)为研究人工智能而开发的。) 美国AutoDesk公司在AutoCAD内部嵌入AutoLISP 的目的是使用户充分利用AutoCAD进行二次开发:实现 直接增加和修改AutoCAD命令,随意扩大图形编辑功能, 建立图形库和数据库并对当前图形进行直接访问和修改 等。
表示回车键
表示TAB键 八进制码为nnn的字符
\015
\011
※必须注意,其中的字符e,n,r,t 必须小写。例如,下 面的表达式执行时都将提示在新的一行上显示: (Prompt“\nEnter first point:”) (Prompt“\012Enter first point:”) 字符串常用于磁盘文件名,标识符的打印名等。
2.程序结构组成 (1)一个完整的AutoLISP程序往往是由一系列按顺 序排列的表达式组成。例如: (defun plus(x y) (+(* x y)x) ) (setq a 2.0) (setq b 4.0) (setq c (plus a b)) 这个简单的AutoLISP程序由4个表达式(即表)组成。 第一个表给出了X*Y+X的函数定义,第二、三表分别给 变量A、B赋值,最后一个表是对定义的PLUS函数的调 用。
5.2.7 预定义的符号 • nil:变量没有赋值,尚无定义。 将nil赋给某一有定义的变量,其结果是取消该 变量的定义并释放其所占存储空间。 引用尚未赋值的变量是错误的。 • nil作为逻辑变量的值,表示不成立。 • T:逻辑成立。 • Pause:暂停,等待用户输入。 • Pi:∏。
5.3 AutoLISP的程序结构
再看下面的例子: X=(A+B)*C 这是一个“中缀表示法”表示的一个表达式,若用 AutoLISP表示则为: (setq X ( * (+ A B)C)) 其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的 名字。 (4)表达式的求值规则 • 整型数、实型数和字符串以其本身的值作为求值结果。 • 符号以其当前的约束值作为求值结果。 • 表根据其第一个元素来进行求值。 (+ ( * 2 3) ( / 6 3)) 返回:8 ( fx a b c) 返回:error: no function definition: fx ( 5 a b c) 返回:error: bad function: 5 ( setq p (3 2 1)) 返回:error: bad function: 3
命令: (setq x 20) 20 命令: (setq Y "24") "24" 命令: !x ;查询x的值 20 命令: !y "24" 命令: (setq !a 20) 20 命令: !a nil 命令: !!A 20 命令: ' (setq x 20) 命令:!x nil
6.文件描述符 文件描述是AutoLISP赋予被打开文件的标识号。当 AutoLISP函数需要访问一个文件时(读该文件或者写该文 件),首先通过该文件描述符去识别并建立联系。下面的 例子打开文件“myfile.dat”,使它可被其它函数读取,并 把该文件描述符的数值赋予符号fl。 (setq fl (open " D:\\user\\myfile.dat " " W "))
5.2.5 表 AutoLISP广泛地使用表。表提供了在一对符号中存储大 量相关数值的有效方法。 例如点的表示,二维点以表(X Y)表示,第一个数值是点 的X坐标,第二个数值是点的Y坐标。三维点以表(X Y Z)表 示,第一个数值是点的X坐标,第二个数值是点的Y坐标,第 三个数值是点的Z坐标。 例如(setq a 6.0)也是一个表,表中有三个元素,第一个 元素setq为一函数名,第二个元素为一变量,第三个元素为 一实数。
5.2.1 整数 整数是由0,1,2,…,9,+,-字符组成,不许出现其 它字符,+号可有可无。例如:+256,103,-15,0。 5.2.2 实型数 实型数是用双精度的浮点数表示并且有至少14位有效精 度,即整数后跟小数。 ※如果实数的绝对值小于1,小数点前必须加0,不要直 接以小数点开头。否则,计算机误认为是点对而出错。例如, “.4”是错误的表示,“0.4”才是正确的写法。实型数也可以 用科学计数法表示,即数字后可有一个可选择的“e”或“E”, 后跟数的指数。例如:0.12E9表示0.12×109。
5.2.4 字符串
字符串是由包括在一对双引号内的一组字符组成的。 字符串包含任何可打印的字符。 字符串中字母的大小写及空格都是有意义的。 字符串的最大长度为100个字符 若字符串中没有任何字符,则为空串“”。 字符串中可以包含ASCⅡ表中的任何字符,通用的表示格式 为“\nnn”,其中nnn是其字符的八进制ASCⅡ码。例如,字符串 “ABCD”也可表示为“\101\102\103\104”。由于反斜杠已作为 前导的标识字符,在字符串中有特殊作用,如果字符串中要包 含它,则必须用两个相邻的反斜杠来表示:“\\”,当然,反斜 杠也可表示为“\114”。由于双引号已用作字符串的定界符,若 需在字符串中包含双引号,则可用“\042”表示。
5.2 AutoLISP数据类型
AutoLISP主要有如下数据类型: 整数 (INT) 实型数 (REAL) 符号原子 (SYM) 字符串 (STR) 表(及用户定义的函数) (LIST) 文件描述符 (FILE) AutoLISP的内部函数 (SUBR) AutoCAD的选择集 (PICKSET) AutoCAD的实体名 (ENAME) 函数分页表 (PAGETB)
用AutoLISP可以定义如下:
(defun fun(x)(cond((> x 0)1)((= x 0)2)((< x 0)0)))
这种书写虽然是合法,但阅读起来很困难,且不易于检查左 右括号是否匹配。因此可以写为:
(defun fun(x) (cond ((> x 0)1) ((= x 0)2) ((< x 0)0) ) )
•
在AutoLISP语言中,表有如下特点: (1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序 集合。 (2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符 号、字符串,也可以是表。 (3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。 如:(15(a b)c d),在此例中,表内有4个元素,其中第二个元素是表。 (4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多 层,从外层向里依次称为0层,1层,2层…… (5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素 都有一个符号。从左向右,第一个元素序号为0,……,第i个元素序号是 i-1。 (6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的 表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号 原子,它既是原子又是表。 (7)表有两种基本类型:标准表和引用表。 标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定 义,后跟调用该函数的参数。 引用表:是在表的前面冠以引用符号('或Quote)对该表不求值。
除可用“\nnn”的形式表示ASCⅡ表中的控制字符外, 在AutoLISP中,对于常用的控制字符有特定的简单的表示 形式,如下表所示。
代 码 \\ \" \e \n 常用的控制字符 意 义 字符\键 字符"键 表示ESC键 表示换行键 等价ASCⅡ \114 \042 \033 \012
\r
\t \nnn
2. AutoLISP的特点 (1)AutoLISP语言是在普通的LISP语言基础上,又扩充 了许多适用于CAD应用的功能而形成的一种程序设计语言。 它是一种解释性求值语言,速度较慢,难以保密,可用任 何文字编辑软件编辑,用纯文本的格式保存。 (2)AutoLISP语言中的一切成分都是以函数形式给出的, 它没有语句概念或其他语法结构。执行AutoLISP程序就是 执行一些函数,再调用其它函数。 (3)AutoLISP把数据和程序统一表达为表结构,故可把 程序当作数据来处理,也可把数据当作程序来执行。 (4)AutoLISP语言中程序运行过程就是对函数求值的过 程,是在对函数求值的过程中实现函数的功能。 (5)AutoLISP语言的主要控制结构是采用递归方式。递 归方式的使用,使得程序设计简单易懂。
(2)在AutoLISP程序中,一个表达式可以分在多行中写, 也可以一行中写几个。一行由“回车”结束。如前所述,原子 之间多个空格的作用和一个空格的作用相同,都起着分隔符的 作用。如果不考虑打印或印刷限制的话,可以利用多个空格使 程序的结构直观,便于阅读。例如已知函数: (当x 0时) 1 f ( x ) 2 (当x 0时) 0 (当x 0时)
5.2.6 变量
1. 符号:用作变量、函数的名字。 2. 命名规则:不能只含数字,除下列字符以外的任何可 打印字符组成:() . ' ; “” 3. 符号长度无限制,但一般不超过6。 4. 变量的数据类型:不需要事先进行类型说明,变量被 赋予值的类型就为变量的类型。 5. 不能使用内部函数名和关键字作为变量名。 6. 变量赋值:(setq 变量1 值1 [变量2 值2...]) 7. 显示变量的值:!变量名(同时将值传递给autocad)。
(3)在AutoLISP程序中可以用注释。 注释的作用是对程序作解释。例如,题目的名称、算 法及使用方法,各函数的功能及调用参数的数据类型,长表 达式的开始、结束标记等。注释以一个分号“;”开始,并 在一行的末尾结束。注释可以出现在程序的任何地方。注释 应该尽量的多,它并不减慢程序运行,但以后阅读程序或修 改代码时,却能节省大量的时间。
1. 表达式 (1)表达式含义:AutoLISP处理的对象是符号表达式(简 称表达式)。它相当于其它编程语言中的程序语句。 (2)表达式的构成:表达式由原子或表构成。 多数情况下以表的形式存在,例如:(函数名 [变元]…) (3)表达式前缀表示法 大多数计算机语言采用“中缀表示法”来表示程序语句, 如在C语言中,给变量X赋值为25.0,写成如下语句: X=25.0 在该表示法中,运算符“=”放在两个操作数“X”和“25.0” 中间。这种表示法是大家都熟悉的。 在AutoLISP语言中,采用的是“前缀表示法”,即把运算符 放在操作数之前,而不是放在它们的中间,并把运算符(即函数 名)和操作数(即调用函数的参数)用圆括号括起来,以表的形式 表示。如上例,用AutoLISP表示: (setq X 25.0) 运算符(setq)放在操作数(X 25.0)之前。
5.2.3 符号原子 符号原子可以包含除以下字符以外的任何可打印字符: ( ) 用作表的定义; · 用作点对;也是一种表。 ' 用作QUOTE函数的简写; ” 用作字符串常数的定界符; ; 用作程序的注释标志。 符号原子的长度没有限制,但尽量不要超过6个字符,否则要 占用额外的内存,降低运行速度。 在AutoLISP中,符号的大小写是等效的。例如,ABCD, Abcd,abcd,AbcD都表示一个符号原子。 AutoLISP中的任何符号都是有值的,即符号都要赋以一定的 数值,或者说符号总是约束在一定值上。一般用赋值函数setq进 行赋值。 例如:(setq X 25.0) 意思是将25.0赋给x,这时x的当前约束值为25.0一个符号在使用 前如没有赋以任何值,则该符号的值为nil(空),它不占用内存 空间。
AutoLISP平程序语言设计
• • • • • •
AutoLISP程序语言概述 AutoLISP数据类型 AutoLISP程序结构 AutoLISP内部函数 函数定义及装载 AutoLISP程序调试与编程实例
5.1 AutoLISP程序语言概述
1. AutoLISP语言简介 LISP(list processing language)语言是一种计算机的 表处理语言,是在人工智能学科领域中广泛采用的一种 程序设计语言。(Lisp 语言最早是在 20 世纪 50 年代末由 麻省理工学院(MIT)为研究人工智能而开发的。) 美国AutoDesk公司在AutoCAD内部嵌入AutoLISP 的目的是使用户充分利用AutoCAD进行二次开发:实现 直接增加和修改AutoCAD命令,随意扩大图形编辑功能, 建立图形库和数据库并对当前图形进行直接访问和修改 等。
表示回车键
表示TAB键 八进制码为nnn的字符
\015
\011
※必须注意,其中的字符e,n,r,t 必须小写。例如,下 面的表达式执行时都将提示在新的一行上显示: (Prompt“\nEnter first point:”) (Prompt“\012Enter first point:”) 字符串常用于磁盘文件名,标识符的打印名等。
2.程序结构组成 (1)一个完整的AutoLISP程序往往是由一系列按顺 序排列的表达式组成。例如: (defun plus(x y) (+(* x y)x) ) (setq a 2.0) (setq b 4.0) (setq c (plus a b)) 这个简单的AutoLISP程序由4个表达式(即表)组成。 第一个表给出了X*Y+X的函数定义,第二、三表分别给 变量A、B赋值,最后一个表是对定义的PLUS函数的调 用。
5.2.7 预定义的符号 • nil:变量没有赋值,尚无定义。 将nil赋给某一有定义的变量,其结果是取消该 变量的定义并释放其所占存储空间。 引用尚未赋值的变量是错误的。 • nil作为逻辑变量的值,表示不成立。 • T:逻辑成立。 • Pause:暂停,等待用户输入。 • Pi:∏。
5.3 AutoLISP的程序结构
再看下面的例子: X=(A+B)*C 这是一个“中缀表示法”表示的一个表达式,若用 AutoLISP表示则为: (setq X ( * (+ A B)C)) 其中“+”、“*”号在AutoLISP中仍用作加法和乘法函数的 名字。 (4)表达式的求值规则 • 整型数、实型数和字符串以其本身的值作为求值结果。 • 符号以其当前的约束值作为求值结果。 • 表根据其第一个元素来进行求值。 (+ ( * 2 3) ( / 6 3)) 返回:8 ( fx a b c) 返回:error: no function definition: fx ( 5 a b c) 返回:error: bad function: 5 ( setq p (3 2 1)) 返回:error: bad function: 3
命令: (setq x 20) 20 命令: (setq Y "24") "24" 命令: !x ;查询x的值 20 命令: !y "24" 命令: (setq !a 20) 20 命令: !a nil 命令: !!A 20 命令: ' (setq x 20) 命令:!x nil
6.文件描述符 文件描述是AutoLISP赋予被打开文件的标识号。当 AutoLISP函数需要访问一个文件时(读该文件或者写该文 件),首先通过该文件描述符去识别并建立联系。下面的 例子打开文件“myfile.dat”,使它可被其它函数读取,并 把该文件描述符的数值赋予符号fl。 (setq fl (open " D:\\user\\myfile.dat " " W "))
5.2.5 表 AutoLISP广泛地使用表。表提供了在一对符号中存储大 量相关数值的有效方法。 例如点的表示,二维点以表(X Y)表示,第一个数值是点 的X坐标,第二个数值是点的Y坐标。三维点以表(X Y Z)表 示,第一个数值是点的X坐标,第二个数值是点的Y坐标,第 三个数值是点的Z坐标。 例如(setq a 6.0)也是一个表,表中有三个元素,第一个 元素setq为一函数名,第二个元素为一变量,第三个元素为 一实数。
5.2.1 整数 整数是由0,1,2,…,9,+,-字符组成,不许出现其 它字符,+号可有可无。例如:+256,103,-15,0。 5.2.2 实型数 实型数是用双精度的浮点数表示并且有至少14位有效精 度,即整数后跟小数。 ※如果实数的绝对值小于1,小数点前必须加0,不要直 接以小数点开头。否则,计算机误认为是点对而出错。例如, “.4”是错误的表示,“0.4”才是正确的写法。实型数也可以 用科学计数法表示,即数字后可有一个可选择的“e”或“E”, 后跟数的指数。例如:0.12E9表示0.12×109。
5.2.4 字符串
字符串是由包括在一对双引号内的一组字符组成的。 字符串包含任何可打印的字符。 字符串中字母的大小写及空格都是有意义的。 字符串的最大长度为100个字符 若字符串中没有任何字符,则为空串“”。 字符串中可以包含ASCⅡ表中的任何字符,通用的表示格式 为“\nnn”,其中nnn是其字符的八进制ASCⅡ码。例如,字符串 “ABCD”也可表示为“\101\102\103\104”。由于反斜杠已作为 前导的标识字符,在字符串中有特殊作用,如果字符串中要包 含它,则必须用两个相邻的反斜杠来表示:“\\”,当然,反斜 杠也可表示为“\114”。由于双引号已用作字符串的定界符,若 需在字符串中包含双引号,则可用“\042”表示。
5.2 AutoLISP数据类型
AutoLISP主要有如下数据类型: 整数 (INT) 实型数 (REAL) 符号原子 (SYM) 字符串 (STR) 表(及用户定义的函数) (LIST) 文件描述符 (FILE) AutoLISP的内部函数 (SUBR) AutoCAD的选择集 (PICKSET) AutoCAD的实体名 (ENAME) 函数分页表 (PAGETB)
用AutoLISP可以定义如下:
(defun fun(x)(cond((> x 0)1)((= x 0)2)((< x 0)0)))
这种书写虽然是合法,但阅读起来很困难,且不易于检查左 右括号是否匹配。因此可以写为:
(defun fun(x) (cond ((> x 0)1) ((= x 0)2) ((< x 0)0) ) )
•
在AutoLISP语言中,表有如下特点: (1)表是指放在一对相匹配的左、右括号中的一个或多个元素的有序 集合。 (2)表中的每一个元素可以是任何类型的表达式,即可以是数字、符 号、字符串,也可以是表。 (3)元素与元素之间要用空格隔开,注意元素与括弧之间可不用空格。 如:(15(a b)c d),在此例中,表内有4个元素,其中第二个元素是表。 (4)表可以是任意嵌套的,上例中即嵌套了一个表。表可以嵌套很多 层,从外层向里依次称为0层,1层,2层…… (5)表中的元素是有顺序的,为便于对表中元素进行存取,每个元素 都有一个符号。从左向右,第一个元素序号为0,……,第i个元素序号是 i-1。 (6)表的大小为表的长度,即表中顶层元素的个数。没有任何元素的 表称为空表。空表用()或nil表示。在AutoLISP中,nil是一个特殊的符号 原子,它既是原子又是表。 (7)表有两种基本类型:标准表和引用表。 标准表:第一个元素的值必须是一个合法的已经存在的AutoLisp函数定 义,后跟调用该函数的参数。 引用表:是在表的前面冠以引用符号('或Quote)对该表不求值。
除可用“\nnn”的形式表示ASCⅡ表中的控制字符外, 在AutoLISP中,对于常用的控制字符有特定的简单的表示 形式,如下表所示。
代 码 \\ \" \e \n 常用的控制字符 意 义 字符\键 字符"键 表示ESC键 表示换行键 等价ASCⅡ \114 \042 \033 \012
\r
\t \nnn