lisp教程
- 格式:doc
- 大小:516.50 KB
- 文档页数:80
LISP语言教程作者:牛魔王—上次修改时间: 2007-03-22 13:13Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
Scheme 语言概要Author: 宋国伟吉林省德惠市信息中心Date: 2003 年 12 月 01 日Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。
本文分为上、下两部分来介绍 scheme 语言。
一.Scheme语言的特点Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。
但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。
它是一个小巧而又强大的语言,作为一个多用途的编程语言,它可以作为脚本语言使用,也可以作为应用软件的扩展语言来使用,它具有元语言特性,还有很多独到的特色,以致于它被称为编程语言中的"皇后"。
下面是洪峰对Scheme语言的编程特色的归纳:∙词法定界(Lexical Scoping)∙动态类型(Dynamic Typing)∙良好的可扩展性∙尾递归(Tail Recursive)∙函数可以作为值返回∙支持一流的计算连续∙传值调用(passing-by-value)∙算术运算相对独立本文的目的是让有编程基础(那怕是一点点)的朋友能尽快的掌握Scheme语言的语法规则,如果您在读完本文后,发现自己已经会用Scheme语言了,那么我的目的就达到了。
AUTO-LISP入门1.养成良好的书写习惯众所周知,Lisp是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大费周折,所以,养成一个好的编程习惯是学好Lisp所必须的。
⑴选择一个较好的编辑器,这是一个基本条件,建议使用Visual Lisp编辑器或Lisplink等专用编辑器,此类编辑器可以对函数突出显示。
⑵按Lisp(DCL)专有格式书写,并经常对程序进行“格式化”,及时发现语法错误,并有利于调试是查找错误。
⑶使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程序条理化。
2.函数中循环与转移的使用在高级语言中一般有类似“goto”的语句实现转移,在AutoLisp中没有转移的函数。
我们可以使用自定义函数实现转移,用if及cond辅助实现条件转移。
当我们需要实现在满足一定条件时进行循环的功能,一般使用while函数,但有时需要判断的条件较复杂时,使用while函数往往不能实现或使得程序不够简洁。
这时我们可以使用“转移”,将需要实现的功能作为(子)函数,使用恰当,可以在程序中任意“转移”。
一般认为,当一段代码在不同处重复使用时,我们才会使用子函数定义,其实,利用函数的更大的优点是使得程序更加结构化。
这就使得我们不必拘泥于程序中的循环语句,而使用函数的循环调用,辅助适当的判断,实现“转移”,如A->B->A。
当然也可以进行自身调用,构成一个“标准的”循环。
如例一中,“程序执行完毕返回”与“空选返回”两种情况如果使用循环语句,其条件是完全不同的,而将函数本身作为子函数调用,程序简洁明了。
3.initget函数中关键字“”(空格)的使用空格可以被用作关键字,一般多用来定义鼠标右键退出。
⑴当用户输入函数不支持控制位(如entsel、nentsel、nentselp)时,可直接使用“(initget " ")”。
⑵当用户输入函数支持控制位(如getpoint等)时,可使用“(initget 1 " ")”禁止空输入,而将回车等空输入作为关键字使用。
CAD中LISP程序使用方法2007-08-06 19:13:32| 分类:学习园地 |字号订阅1. 对于提供附件下载的,把附件下载就可以了2. 对于提供的源LISP代码,把代码拷贝、粘贴到一个文件,自己起个名或者若程序里面注释推荐了文件名,就用推荐的,然后保存成扩展名是LSP的文件即可了。
LISP程序使用方法:加载LISP1. 可以使用APPLOAD命令,然后去找到要加载的LISP文件,加载即可。
2. 可以自己从文件管理器把LISP文件拖动到ACAD的图形窗口,也可以加载3. 在命令行后用,(load "c:\\temp\\xxx.lsp")也可以加载,路径名请输入实际的路径。
另:对于一个LSP程序,(defun 后面的既是命令或者函数,一般程序应该有提示,若没有,标志符c:后面的单词是可以在ACAD下使用的命令,既可以在COMMAND:后面直接输入,即可执行。
CAD快速切换图层LISP代码(方法2)给楼主发一个图层更改的lisp程序,按对应数字键就可以切换到相应的图层。
很方便。
0————01————OBJ2————6t3————SCETR。
8————BORDER如果这些不是你想要的图层,将lisp用笔记本打开,把里边的OBJ,6t等图层名改为你想要的就可以了。
以后要切换图层时,按相应的数字键即可。
(defun YH_chlayer (YH_layer / YH_S)(if (null (tblsearch "LAYER" YH_layer))(entmake (list'(0 . "LAYER")'(100 . "AcDbSymbolTableRecord")'(100 . "AcDbLayerTableRecord")(cons 2 YH_layer) ;图层名称'(70 . 0) ;图层状态'(62 . 7) ;图层颜色'(6 . "bylayer") ;图层线型)))(setq YH_S (cadr (ssgetfirst)))(if YH_S(command "CHPROP" YH_S "" "la" YH_layer "c" "bylayer" "")(setvar "clayer" YH_layer))(princ))(defun c:0 ()(YH_chlayer "0"))(defun c:1 ()(YH_chlayer "OBJ"))(defun c:2 ()(YH_chlayer "6t"))(defun c:3 ()(YH_chlayer "SCETR"))(defun c:4 ()(YH_chlayer "HIDD"))(defun c:5 ()(YH_chlayer "DIM"))(defun c:6 ()(YH_chlayer "DASH"))(defun c:7 ()(YH_chlayer "TEXT"))(defun c:8 ()(YH_chlayer "BORDER"))#Cad到上面一行为址,保存为lsp格式。
Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行(List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数(Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.第3节--------------------------------------------------------------------------------数据型态(Data Type)整数(INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数(REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6字符串(STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD"像素名称(ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化(V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号' 双引号"分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示第4节--------------------------------------------------------------------------------变数(V ariable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPA TION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(A TAN 弧度参数)e.g. (A TAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)e.g. (SQRT 30) Result : 5.47723(ABS 数值参数)e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOA T 数值参数)e.g. (FLOA T 12) Result : 12.0整数转字符串(ITOA数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(R TOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数)e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP 数值参数)e.g. (ZEROP 0) Result : Te.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,V isual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下:(DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜线\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nil e.g. (= 2 2.0) Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回nil 值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习(Exercises)COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = V ery High, 51至100 = High, 26至50 = Medium, 25或以下= Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "V ery High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串V ery High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "V ery high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串V ery High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "V ery High") (PRINC DISP)))注意: 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断多重条件(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "V ery High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环(Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEA T 重复次数[表达式....] )e.g. (REPEA T 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式....] )若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意: 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为T,令循环不断重复而无法结束;在上例中:---- 若WHILE函数的条件表达式设定为(T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习(Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0。
DCL(D i alog Control Languag e)语言教程课程简介课程主要介绍AutoLISP程序的编写,配合使用DC L(Dialog Control Language)语言,作对话方框的开发及应用.本课程只适合对AutoLISP程序设计有相当认识之人仕.全课共分为12篇,每篇一个主题;而每篇再分为若干小节,每天顺序显示.内文若有错漏,敬祁见谅,欢迎来函赐教,多谢!!课程大纲第一篇(0 - 4 课) AutoLISP及Dialog程序设计基本知识第二篇(5 - 8 课)开启对话方框第三篇(9 - 13 课)设定及取得对话框内组件的值第四篇(14 - 19 课)按钮(button)及核取框(切换钮,toggle)第五篇(20 - 25 课)横列(row),直行(colum n),空白(spacer)及文字组件(text)第六篇(26 - 30 课)滑杆(滚动条)组件(sli d er)第七篇(31 - 36 课)其它按钮及影像按钮组件(image_button)第八篇(37 - 43 课)列表选框组件(list_bo x)第九篇(44 - 48 课)下拉式(弹出式)列表选框组件(popup_list)第十篇(49 - 52 课)选台钮(radio_button)第十一篇(53- 57 课)影像组件(image)第十二篇(58- 60 课)其它组件注意事项在各篇课程所介绍的语法结构中,包含在方括号[]中的数据,表示为选择性项目;可因应情况,自行决定是否须要加上.字型为紫色的项目,表示可自行设定其名称或内容定义文件为设定对话框组件的纯文本文件(扩展名为DCL),程序文件则是编写AuotLISP程序的纯文本文件(扩展名LSP)在定义档中,批注以双除号//开始,批注符号及其右边的文字可以不输入;但在程序文件中,批注以分号;开始,批注符号及其右边的文字可以不输入.第一篇基本知识基本知识对话框是现今最流行的人机互动面接口;在早期的AutoCAD版本中巳经使用,但只有在R12版本开始,才提供给用户自行编程的对话框开发功能.对话框的描述定义在一纯文本檔(扩展名为DC L)内,无须特别的开发环境定义文件中的对话框描述,均以对话控制语言(D ialog Control Language,简称DCL语言) 所建立在AutoLISP程序中,配合可编程对话框(Porg r ammable Dialog Box,简称PDB)函数,激活及操控对话框可以在一个定义档(扩展名DCL)中定义多个对话框对话框由方块本身,及包含于其内的组件(或称为控件,构件)所组成每个组件的属性定义均包含在一对大括号{}中在定义文件中,各组件及其属性均为小写;只有在赋值给属性,或设定对话框名称时才可使用大写字母属性以等号=赋值,并以分号;结束(注意: 在A u toLISP程序中,分号是作为批注) 一般要在组件名称前加上一个冒号:,但若组件并不设定属性,则不需要在组件名称前加冒号,但却要以分号结束空行会被忽若定义档发生严重的错误,会在当前的目录下,产生ACAD.DCE文件,以指明所发生的错误.定义档BASE.DCL默认在SUPPORT的目录中,它包含了各组件的原型定义,及各类型巳定义的其它基本组件;而所有自行开发的对话框定义文件,都可以使用在BASE.DCL定义文件中的各个组件ACAD.DCL默认在SUPPORT的目录中,它包含了AutoCAD中所有标准对话框的定义参考定义档可在自行开发的对话框定义文件中,经由inclu de指令,取得指定DCL文件中所定义的组件;其语法如下:@include "对话框定义档"e.g. @include "david.dcl"定义档名称要包含在双引号"中,可以在檔名前加上定的目录路径会先在当前的目录中搜寻该定义文件,然后是定义文件所在的目录;若有指定档案的路径,则只会在指定的目录内寻找不可以参考ACAD.DCL所定义的对话框,即不可以使用@include"acad.dcl"预视对话框若在Visual LISP中开启一对话框定义文件,即可使用:工具-- 接口工具-- 预览编辑器DCL在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框亦可直接输入该对话框的名称(要注意大小写)批注///**/表示其右边(至该行末端)的文字视为注释包括在两个批注符号中间的所有文字(可跨越多行)均视为注释语义检核提供4个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定义档中的任何位置,但不能在任何对话框的定义内.dcl_settings : default_dcl_settin g s {audit_level = 3;}等级0 不检查: 只有在该定义档巳被检核且不会再作修改时使用等级1 错误: 找出可能造成AutoCAD终止的错误,此等级也是默认值等级2 警告: 找出配置或行为模式的错误,所有定义在修改后,最少应执行此等级的检查一次等级3 提示: 找出多余的属性定义对话框的设计美观性颜色配比,组件整齐排列等方便性相同功能的项目要编排在一起,或使用线框包围使用频繁的项目应设置在最显眼及方便的位置适当设置快捷键及默认值(默认值,省缺值)除非对话框中的项目过多,否则应避免使用巢状(嵌套)式对话方框互锁或互换项目选取(或不选取)时,会否引致其它项目功能的改变(enable或disable...等)对话框定义文件内容模式对话框名称:dialog{label="对话框标题";:组件名称{属性名称=属性值;}//组件定义结束}//对话框结束定义说明1 对话框名称就是由AutoLISP程序,启动对话框时所呼叫的名称;可以自行设定,要区分大小写字母dialog为对话框中,最外层的组件(即整个对话框),其它的组件均包含在其中一般组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束2 开大括号{紧随组件名称之后,以包含该组件的属性或其它组件label为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该行叙述3 包含在对话框中的其它组件组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束4 开大括号{紧随组件名称之后,以包含组件的属性或其它组件包含在组件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该行叙述5 以关大括号}与第4行的开大括号}对应,以结束该组件(第3行)之定义双除号//右边的文字即为批注6 以关大括号}与第2行的开大括号}对应,以结束该组件之定义(在本例中为整个对话框的定义,即第1行的dialog组件注意: 上例中缩排只为方便观察及维护,不作缩排亦可包含在对话框中的组件及组件中的属性可以不只一个练习(Exercises)请输入以下的对话框定义,并命名为RECT.DCL(纯文本格式),存在C盘的根目录中RECT:dialog{label="Rectangle" ;:text//文字组件{label="Rectangle width :" ; //组件的属性}ok_only;}定义说明:1 设定对话框的名称为RECT,紧接一个以冒号开始的组件dialog2 最左边为dialog组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectangle",以分号结束此行叙述3 text为"字符串"组件,其作用是在对话框中显示文字,组件名称前要加冒号4 最左边为text组件的开大括号,右边是其属性l a bel,并以等号设定其属性值为"Rectanglewidth",最后以分号结束此行叙述5 关大括号是对应第4行的开大括号,这对大括号同属于第3行的text组件6 ok_only为一"按钮组件",它的作用是在对话框中显示一个"确定(OK)"按钮;在一个对话框中,必需提供最少一个"确定"按钮,或一个"取消"按钮(组件名称为cancel_button),以作为结束对话框之用;本例中不设定按钮之属性,固不需以冒号放在组件名称的前面,但却需要以分号结束7 关大括号是对应第2行的开大括号,这对大括号同属于第1行的dialog组件注意:虽然定义档巳经完作,但仍要待学习完第2篇的课程后,才能开启及显示该对话框第二篇开启对话框AutoLISP函数加载DCL定义文件函数(LOAD_DIALOG "对话框定义档名称")e.g. (LOAD_DIALOG "C:/RECT.DCL")自变量是要加载的对话框定义文件名称字符串(所以要在前后加双引号);若不设定扩展名则预设为.DCL 函数会依资源搜寻路径找寻该定义文件;不在搜寻路径中的档案,要在文件名前加上指定的路径函数若成功加载该定义档,会传回一正整数值的档案处理码,供其它函数呼叫使用;无法载入时则传回负整数值一般会将传回的档案处理码以SETQ函数存入变量中e.g. (SETQ DCL_ID (LOAD_DIALO G"C:/R E CT.DCL"))开启并显示对话框(NEW_DIALOG "对话框名称"档案处理码["预设动作"[对话框位置]])e.g. (NEW_DIALOG "RECT" DCL_ID)对话框名称为字符串,要在前后加双引号;要注意一个定义檔中,可包含多个对话框名称及其定义档案处理码是经由LOAD_DIALOG函数取得默认动作为字符串表示式;函数可以不加默认动作,或以空字符串""表示如果要设定对话框显示时的位置,则必须同时设定默认动作对话框位置为2D的点串行,指定对话框左上角的X,Y坐标如果以'(-1 -1)为对话框位置,则会在绘图屏幕的中心点开启对话框如果成功开启对话框,函数会传回T,否则传回N IL开始接受使用者输入(START_DIALOG)函数不须提供任何自变量使前一个用NEW_DIALOG函数开启的对话框开始作用,直至操作表示式或回复函数呼叫DONE_DIALOG函数为止一般DONE_DIALOG与关键词accept(一般是按下确定按钮)或关键词cancel(一般是按下取消按钮)相关若传回值为1,表示使用者按下确定钮结束对话框;0表示按下取消钮;-1表示全部对话框都以TERM_DIALOG函数终止;大于1的整数,其意义由应用程序决定释放(卸除)对话框(UNLOAD_DIALOG "档案处理码")e.g. (UNLOAD_DIALOG DCL_ID)从内存释放档案处理码(经由LOAD_DIALOG函数取得)指定的对话框定义档函数传回值一定是NIL对话框开启方式(DEFUN C:函数名称()(SETQ 变量(LOAD_DIALOG "对话框定义档"))(NEW_DIALOG "对话框名称"变量)(START_DIALOG) (UNLOAD_DIALOG 变数))程序说明:1 以DEFUN函数定义程序的名称,使用LOAD_DIALOG函数加载指定的对话框定义档使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量中,以方便其它函数使用2 使用NEW_DIALOG,开启及显示定义文件中(档案处理码),指定的对话框3 使用START_DIALOG函数,使对话框开始作用并接受使用者输入使用UNLOAD_DIALOG函数以结束对话框4 关括号是对应第1行DEFUN函数左边的开括号,结束整个程序练习(Exercises)编写一AutoLISP程序,以开启上一课所定义的对话框;并将该程序命名为RECT.LSP,存在C盘的根目录中,程序代码如下:(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL"))(NEW_DIALOG "RECT" DCL_ID)(START_DIALOG) (UNLOAD_DIALOG DCL_ID))程序说明:1 以DEFUN函数定义程序的名称为RECT,使用LOAD_DIALOG函数将对话框定义文件RECT.DCL载入;使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量DCL_ID中,以方便其它函数使用2 使用NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为RECT的对话框3 使用START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可按);使用UNLOAD_DIALOG函数以结束对话框4 关括号是对应第1行DEFUN函数左边的开括号,结束整个程序编辑框组件(edit_box)可供用户直接输入字符串的矩形方框;注意在编辑框中所显示及输入的数据均为字符串型态,而数字则要在取得编辑框的字符串内容后(在下一篇中介绍),使用AutoLISP函数将其转为数值型态的数据:edit_box//组件名称{属性="属性值";}属性label显示在编辑框前面(左边)的提示文字key 其属性值即为使用该组件的关键词,使在AutoL I SP程序中操控此组件;在同一个对话框定义中,不能有相同名称的关键词定义edit_limit指定在编辑框中,可输入字符串的最大字符长度edit_width指定编辑框显示时的阔度(通常与fixed_width属性一拼使用)value 指定编辑框显示时,当中的默认值(注意显示数值数据时,要先用AutoLISP 函数将数据(或变量)转为字符串型态)fixed_width通常与width属性一拼使用,以固定编辑框显示时的阔度(其属性值可设定为true或false)is_enable 可设定编辑框是否可以使用(其属性值可设定为true或false,默认值为true)alignment 如果组件成水平方向排列,属性值可设定为lef t,right或centere d如果组件成垂直方向排列,属性值可设定为top,bottom或centere d(水平方向的默认值为left,垂直方向则为cent e red)其它属性action allow_accept fixed_height heightis_tab_stop mnemonic width练习(Exercises)将上一课的RECT.DCL对话框定义档复制至RECT1.DCL,开启新的定义檔并作如下的修改,使其可以输入四边形的阔度及高度;将AutoLISP程序文件RECT.LSP复制至RECT1.LSP,开启新的程序文件,并将要加载的对话框定义档改为RECT1(程序第1行);完成后即可加载及执行新的程序文件RECT:dialog{label="Rectangle" ;:edit_box//编辑框组件{label="Rectangle width : " ;key="RECT_W" ;edit_limit=16;edit_width=10;fixed_width=true;}:edit_box//编辑框组件{label="Rectangle heigth :" ;key="RECT_H" ;edit_limit=16;edit_width=10;fixed_width=true;}ok_only;}定义说明:1 设定对话框的名称为RECT,紧接一个以冒号开始的组件dialog2 最左边为dialog组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectangle",以分号结束此行叙述3 edit_box为"编辑框"组件,组件名称前要加冒号4 最左边为edit_box组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectangle width : ",最后以分号结束此行叙述5 设定属性key的属性值为RECT_W(即设定此编辑框的名称)6 设定属性edit_limit的属性值为16(即最多可以在编辑框中输入16个数字)7 设定属性edit_width的属性值为10(编辑框只会显示10个字的长度)8 设定属性fixed_width的属性值为true,表示表将编辑框以固定的阔度显示9 关大括号是对应第4行的开大括号,这一对大括号同属于第3行的edit_box组件10至16 与3至9行相似,设定另一个编辑框以输入高度的数据;只有属性label及key的属性值不同17 以ok_only组件,在对话框中显示一个确定(OK)按钮,作为结束对话框之用18 关大括号是对应第2行的开大括号,这一对大括号同属于第1行的dialog组件注意1 在第一个编辑框(输入四边形的阔度)的label属性值中,在字符串最后的冒号后面,加多了一个空格,目的是方更与下一个编辑框对齐第三篇设定及取得对话框组件内的值AutoLISP函数设定组件的值(SET_TILE "组件关键词"设定值)e.g. (SET_TILE "RECT_W" "50.0")组件的初始值可在定义文件中以属性value设定,但在程序文件中则以此函数设定组件关键词即是在对话框定义文件中,以组件属性key所定义的属性值,以赋予该组件一个操作名称组件关键词是有区分大小写的此函数要在START_DIALOG函数之后才能使用取得组件的值(GET_TILE "组件关键词")e.g. (GET_TILE "RECT_W")作用是在AutoLISP程序文件中取得组件(以关键词指定)的设定值组件关键词的说明与SET_TILE函数相同此函数要在DONE_DIALOG函数之前使用(即要在对话框结束前使用)设定组件的状态(MODE_TILE "组件关键词"状态模式)e.g. (MODE_TILE "RECT_W" 0)作用是在AutoLISP程序文件中设定组件(以关键词指定)的使用状态,其状态模式可以设定为下列任一整数值:0 使指定的组件成为使用状态1 使指定的组件成为禁用状态(组件以灰色显示)2 使指定的组件成为焦点3 选取指定编辑框组件的内容4 图像高亮度显示的开关组件关键词的说明与SET_TILE函数相同练习(Exercises)以修改对话框定义档的方式,设定输入阔度的编辑框其初始值为50,输入高度的编辑框其初始值为25定义档将RECT1.DCL复制至RECT2.DCL,在关键词为REC T_W的组件中,加入value属性并设定其初始值为50;在关键词为RECT_H的组件中,加入value属性并设定其初始值为25程序文件将RECT1.LSP复制至RECT2.LSP,只须修改其加载的定义档名称为RECT2.DCL即可;完成后存盘,进入AutoCAD并载入RECT2.LSP程序文件,执行RECT2程序RECT:dialog{label="Rectangle" ;:edit_box{"Rectangle width : " ;key="RECT_W" ;edit_limit=16;edit_width=10;fixed_width=true;value="50.0"//注意设定值为字符串型态,要在前后加双引号}:edit_box{"Rectangle height :" ;key="RECT_H" ;edit_limit=16;edit_width=10;fixed_width=true;value="25.0"//注意设定值为字符串型态,要在前后加双引号}}以修改AutoLISP程序文件的方式,使输入阔度的编辑框其初始值为50,输入高度的编辑框其初始值为25定义档将RECT1.DCL(不是RECT2.DCL)复制至RECT3.DC L,不作任何修改程序文件将RECT1.LSP复制至RECT3.LSP,程序代码如下:(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT3.DCL"))(NEW_DIALOG "RECT" DCL_ID)(SET_TILE "RECT_W" "50.0") (SET_TILE"RECT_H" "25.0")(START_DIALOG)(UNLOAD_DIALOG DCL_ID))程序说明:1 以DEFUN函数定义程序的名称RECT,使用LOAD_D I ALOG函数将对话框定义文件RECT3.DCL载入;使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量DCL_ID中,以方便其它函数使用2 使用NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为RECT的对话框3,4 使用SET_TILE函数,设定输入阔度的编辑框组件RECT_W(组件关键词,在定义文件中key设定的属性值)为50,设定输入高度的编辑框组件RE C T_H为255 使用START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可按);使用UNLOAD_DIALOG函数以结束对话框6 关括号是对应第1行DEFUN函数左边的开括号,结束整个程序AutoLISP函数组件指定动作(ACTION_TILE "组件关键词""指定动作")e.g. (ACTION_TILE "RECT_W" "(S ETQ TEMP 1)")当焦点在指定的组件(关键词)上并按下接受键时,即会执行函数所指定的动作指定动作会取代定义文件中,该组件的action属性之默认动作组件关键词"accept"在默认情况下是与确定按钮组件关连(即是确定按钮的默认关键字),"cancel"则与取消按钮组件关连(即是取消按钮的默认关键词)终止对话框(DONE_DIALOG [指定传回值])e.g. (DONE_DIALOG)此函数的传回值为一个2D点串行坐标,为结束对话框时,对话框的所在位置;可作为下次启动同一个对话框的位置自变量,使对话框在之前结束时的位置再次显现练习(Exercises)将定义档RECT3.DCL复制至RECT4.DCL,但不作任何修改.将程序文件RECT3.LSP复制至RECT4.LSP,并修改为: 使用ACTION_TILE函数,指定在按下确定钮时,执行一辅助程序;在该辅助程序中,使用GET_TILE函数最得对话框中四边形的阔度及高度,并在用户选取的位置上绘画出四边形.(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT4.DCL"))(NEW_DIALOG "RECT" DCL_ID)(SET_TILE "RECT_W" "50.0")(SET_TILE "RECT_H" "25.0")(ACTION_TILE "accept" "(S_RECT)(DONE_DIA L OG)")(START_DIALOG)(UNLOAD_DIALOG)(SETQ PT_0 (GETPOINT "\nSelect rectangle lower left point :"))(SETQ PT_1 (POLAR PT_0 0 TMP_W)PT_2 (POLAR PT_1 (/ PI 2) TMP_H)PT_3 (POLAR PT_2 PI TMP_W))(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")(PRINC))(DEFUN S_RECT() (SETQ TMP_W (ABS (ATOF (GET_TILE "RECT_W")))TMP_H (ABS (ATOF (GET_TILE "RECT_H")))))主程序(RECT)说明:1 注意将LOAD_DIALOG函数所加载的对话框定义档改为RECT4.DCL2- 4参阅RECT3程序的说明5 使用ACTION_TILE函数设定关键词为accept的组件(默认为确定按钮)的指定动作: 先执行辅助程序S_RECT,取得输入的数据,再使用DO N E_DIALOG函数结束对话框6 参阅RECT3程序,第5行的说明7 使用GETPOINT函数让用户选取四边形的左下角位置坐标,存入变量PT_08使用POLAR函数取得新坐标点: 从选取点PT_0开始,向右(角度为0),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_19 使用POLAR函数取得新坐标点: 从上一点PT_1开始,向上(角度90,等于PI除2),距离为四边形的高度(变量TMP_H,在辅助程序中取得),存入变量PT_210 使用POLAR函数取得新坐标点: 从上一点PT_2开始,向左(角度1800,等于PI),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_3;注意最右边的关括号,是对应第8行SETQ函数左边的开括号11 使用COMMAND函数执行PLINE指令,并分别设定四个坐标变量,最后以"C"选项封闭聚合线12 以一个不带参数的PRINC函数,抑制多余的显示及传回值;最右边的关括号是对应第1行DEFUN函数左边的开括号辅助程序(S_RECT)说明:1 设定函数名称;使用GET_TILE函数取得指定关键词(RECT_W,代表输入阔度的编辑框组件)的值,并将该值使用ATOF函数由字符串型态转为实数型态(有小数);再使用ABS函数取得实数的绝对值,以防止使用者输入负数;最后将数据存入变量TMP_W2 使用GET_TILE函数取得指定关键词(RECT_H,代表输入高度的编辑框组件)的值,转型及取得绝对值后,存入变数TMP_H3 用一个关括号,对应第1行DEFUN函数左的开括号第四篇按钮及核取框(切换钮)按钮组件(button)一个矩形的按钮,可显示指定的讯息在按钮上:button//组件名称{属性="属性值";}属性label显示在按钮中的提示文字key 其属性值即为使用该按钮组件的关键词width 指定按钮的显示阔度height 指定按钮的显示高度fixed_width通常与width属性一并使用,以固定按钮的显示阔度fixed_height通常与height属性一并使用,以固定按钮的显示高度is_enable 可设定按钮是否可以使用,其属性值可设定为t r ue(可使用)或false(禁用,按钮中的消息正文变为灰色显示),默认值为tr ueis_default属性值可设定为true或false;当使用者按下接受键(大部份的情况,ENTER 被用作接受键)时,本属性设定为true的组件会自动被选取.当使用者在allow_accept属性设为true的编辑框,列表框或图像按钮中.按下接受键或双击鼠标键(只对列表框及图像按钮有效)时,本属性设定为true的组件亦会自动被选取alignment 如果组件成水平方向排列,属性值可设定为lef t,right或centered(若不设定则预设为left);如果组件成垂直方向排列,属性值可设定为top,bottom 或centered(若不设定则预设为centered)其它属性action is_cancel is_tab_top mnemonic核取框(切换钮)组件(toggle)是一个启用或关闭的切换方框,当方框中没有剔勾符号时,表示该功能为关闭状态,其组件的值为0;当方框中有剔勾符号时,表示该功能为启用状态,其组件的值为1:toggle//组件名称{属性="属性值";}属性label显示在切换钮后面(右边)的提示文字key 其属性值即为使用该按钮组件的关键词is_enable 可设定切换钮是否可以使用,其属性值可设定为true(可使用)或false(禁用),默认值为truevalue 方框中没有剔勾符号时,表示该功能为关闭状态,其组件的值为0(亦是预设值);相反则为启用状态,组件的值为1alignment 如果组件成水平方向排列,属性值可设定为lef t,right或centered(若不设定则预设为left);如果组件成垂直方向排列,属性值可设定为top,bottom或centered(若不设定则预设为centered)其它属性action is_tab_stop width heigthfixed_width fixed_heigth练习(Exercises)在四边形的对话框中,增加一核取框,以确定是否在四边形中加上交叉的对角线;另在对话框的底部增加两个按钮,按下时可使核取框作用或禁用定义档将RECT4.DCL复制至RECT5.DCL,在新的定义档中增加核取框及按钮定义RECT:dialog{label="Rectangle" ;:edit_box{"Rectangle width : " ;key="RECT_W" ;edit_limit=16;edit_width=10;fixed_width=true;value="50.0"}:edit_box{"Rectangle heigh t:" ;key="RECT_H" ;edit_limit=16;edit_width=10;fixed_width=true;value="25.0"}:toggle//新增的核取框(切换钮)组件{label="X line in rectangle" ;key="RECT_X" ;}:button//新增的按钮组件{label="&Enable" ;key="RECT_E" ;width=10;fixed_width=true;}:button//新增的按钮组件{label="&Disable" ;key="RECT_D" ;width=10;fixed_width=true;}ok_only;}定义说明:第1至第18行的定义,与上一课练习RECT4.DCL定义相同,不再叙述19 以冒号开始,定义一个切换钮组件20 切换钮的开大括号,以label属性定义切换钮右边的消息正文21 以key属性设定切换钮的操作关键词22 关大括号是对应第20行的开大括号,此对大括号同属于第19行的切换钮组件23 以冒号开始,定义一个按钮组件24 按钮的开大括号,以label属性定义按钮上显示的消息正文.注意: 字符串的&符号,表示设定在该符号右边的一个字母为快捷键;在显示时,&符号不会出现,但&符号右边的一个字符会以加底线显示25 以key属性设定按钮的操作关键词26 以width属性设定按钮的阔度,否则按钮会自动加长并占用整列的长度27 fixed_width属性设定为true,使按钮以固定的阔度显示28 关大括号是对应第24行的开大括号,此对大括号同属于第23行的按钮组件29至34 与上个按钮的定义类似(23至28行),但其label及key的属性值不同35 定义一个确定按钮,以结束对话框36 关大括号是对应第2行的开大括号,此对大括号同属于第1行的dialog组件程序文件将RECT4.LSP复制至RECT5.LSP,其程序代码如下:(DEFUN C:RECT() (SETQ DCL_ID (LOAD_D I ALOG "C:/RECT5.DCL"))(NEW_DIALOG "RECT" DCL_ID)(SET_TILE "RECT_W" "50.0")(SET_TILE "RECT_H" "25.0")(ACTION_TILE "accept" "(S_RECT)(DONE_DIALOG)")(ACTION_TILE "RECT_E" "(MODE_TILE \"RECT_X\" 0)");设定使用按钮的动作(ACTION_TILE "RECT_D" "(MODE_TILE \"RECT_X\" 0)");设定禁用按钮的动作(START_DIALOG)(UNLOAD_DIALOG)(SETQ PT_0 (GETPOINT "\nSelec t rectangle lower left point : "))(SETQ PT_1 (POLAR PT_0 0 TMP_W)PT_2 (POLAR PT_1 (/ PI 2)TMP_H)PT_3 (POLAR PT_2 P I TMP_W))(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")(IF (= TMP_X 1) (COMMAND"LINE" PT_0 PT_2 "" "LINE" PT_1 PT_3 ""))(PRINC))(DEFUN S_RECT() (SETQ TMP_W (ABS (AT O F(GET_TILE "RECT_W")))TMP_H (ABS (ATOF (GET_TILE "RECT_H")))TMP_X (ATOI (GET_TILE "RECT_X"))) ;取得切换钮的状态)主程序(RECT)说明:1至5 与程序RECT4.LSP相同,主要是加载及显示对话框,并设定其中的组件6 使用ACTION_TILE函数,设定当按下ENABLE按钮(关键词为RECT_E)时,所执行的动作: 使用MODE_TILE函数,设定切换钮(关键词为RECT_X)的状态为0,使其处于作用状态.注意指定的动作为字符串型态,前后要加上双引号";而包含在字符串中的双引号,则必须以反斜杠加双引号\"表示7 与第6行相似,设定按下DISABLE按钮(关键词为R ECT_D)时,将切换钮的状态设为1,使其处于禁用状态8至13 与程序RECT4.LSP相同,主要是用作绘画出四边形14 使用IF函数检查变量TMP_X(在辅助程序中取得,表示切换钮的状态)是否为1;若是则以COMMAND函数,执行两个LINE指令,绘画出四边形的对角线15 以一个不带参数的PRINC函数,抑制多余的显示及传回值;最右边的关括号是对应第1行DEFUN函数左边的开括号辅助程序(S_RECT)说明:1,2 大致与RECT4.LSP的辅助程序相同,都是用以取得编辑框内的数据并存入变量中3 使用GET_TILE函数取得切换钮(关键词为RECT_X)的状态(传回值是字符串,"0"是使用,"1"是禁用),再用ATOI函数将传回的字符串变为整数,存入变量TMP_X,供主程序第14行的IF函数,判断是否需要加上对角线.注意: 传回值转型后,结果只会是1或0,固不须使用ABS函数取其绝对值4 关括号与1行DEFUN函数左边的开括号对应第五篇横列,直行,空白及文字组件横列(row)及直行(column)组件其实这两个都不算是实体的组件,只是用作指定后续的其它组件的排列格式指定为横列时,则包含在此组件一对大括号中的所有组件,均作水平左至右排列;直行时则呈垂直上至下排列。
Lisp⼊门Lisp ⼊门LISP 是 LISt Processor 的缩写,是“列表处理语⾔”意思。
Lisp语⾔最初是由美国的 John McCarthy 在 1958 年提出来的,是最早的计算机语⾔之⼀。
然⽽,半个多世纪后的今天,Lisp 语⾔仍然在使⽤,并且还会继续被使⽤,这和它独特的结构是分不开的。
Lisp的基本框架可以容下任何修订或扩充。
⽽且 LISP 语⾔在符号处理⽅⾯的优势,LISP 最初使⽤于⼈⼯智能处理。
(早期有部分⼈⼯智能的研究者认为:“符号演算系统可以衍⽣出智能。
”)《⿊客与画家》的作者 Paul Graham 就对 Lisp 语⾔赞誉有加,认为⼤部分的现代语⾔都在向 Lisp 靠近。
安装 Mac 环境在已安装 HomeBrew 前提下在 Terminal 键⼊brew install sbcl开始Terminal 中键⼊sbcl会有This is SBCL 1.4.6, an implementation of ANSI Common Lisp.More information about SBCL is available at </>.SBCL is free software, provided as is, with absolutely no warranty.It is mostly in the public domain; some portions are provided underBSD-style licenses. See the CREDITS and COPYING files in thedistribution for more information.*这个就是 Lisp 的解释器,在这⾥我们⾸先要知道退出是 (quit)。
解译器的功能就是对⼀个输⼊的表达式求值的东西。
函数在 Python 中1+21 + 2⽽在 Lisp 中1+2(+ 12)在Python中 + 是运算符,⽽在 Lisp 中 + 是运算符,同时也是函数,但它是前缀表达。
Lisp使用说明1.TXGX-修正单行文字、多行文字或块属性的小数位。
2. (defun rtos2 (number mode n / st gst sn ln cn dn )函数:RTOS函数的增强版,将指定的数字字符串转换为指定小数位的数字字符串;st为要处理的字符串,n为要保留的小数位数。
3. 2PLI--显示二维多段线上各顶点的坐标值。
4. 3PLI--显示三维多段线上各顶点的三维坐标值。
5.AAPL--该程序主要用于绘制横断面图时计算填挖方面积。
6. (defun aa4p (x1 y1 x2 y2 x3 y3 x4 y4 /)函数:给定四点计四点确定两直线之间的填挖方面积。
7. PLTR--将二维多段线顶点按相反顺序排列.8. BBG-标注标高9.SY2-拾取一个标高文本和一个点来设置坐标系.10. MBG-制作标高块BG.11.MBX-制作标高块BX.12.MBXY-制作标高块BXY13.GX-更新坐标标注.14.M2T-多行文本转换为单行文本。
15. SY-拾取已标注好的标高块来设置坐标系.16. BBX-标宽度17. BXY—标坐标18. SXY—根据标注好的坐标块设置坐标值。
19. RDTX2--拾取单行文本,多行文本的文本值。
20. GMT--规范化多行文字(command "-style" "chbz" "isocp.shx,hhztxt.shx" "0" "0.7" "0" "N" "N")21.GMT2--增强版的规范化文字22. BR1 ---指定一点将所穿越的实体截断23. BBR----指定两点将所穿越的实体截断.24. BZWB----根据标注文字位置坐标,文字方向及标注文本字符串来进行文本标注25. DMTR----将横断面图中的断面线转换为平面图中的三维点线。
Lisp入门 [转]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教程Lisp 是一种编程语言,源自于Lambda演算,并且被广泛应用于人工智能领域。
本教程将介绍Lisp的基本概念和语法,帮助初学者快速入门。
1. 表达式和函数调用在Lisp中,所有的计算都是通过表达式和函数调用完成的。
表达式由一个或多个函数和参数组成,并用括号括起来。
例如,(加 2 3) 表示将2和3相加。
2. 变量和赋值在Lisp中,可以使用变量来存储数据,并使用赋值操作符将一个值赋给一个变量。
例如,(setq x 5) 表示将5赋给变量x。
3. 条件语句Lisp提供了条件语句来根据不同的条件执行不同的代码块。
最常用的条件语句是(if-else)语句,它根据一个条件判断是否执行某个代码块。
例如,(if (= x 5) (print "x是5") (print "x不是5")) 表示当x等于5时输出"x是5",否则输出"x不是5"。
4. 循环Lisp提供了多种循环结构来重复执行一段代码。
最常用的循环结构是(do)循环,它可以设置一个计数器,并执行一段代码块指定的次数。
例如,(do ((i 0 (+ i 1))) ((= i 10)) (print i)) 表示从0到9输出i的值。
5. 函数定义和调用在Lisp中,可以使用(define)关键字来定义一个函数,并使用函数名和参数列表来调用这个函数。
例如,(defun square (x) (* x x)) 定义了一个计算平方的函数,并可以使用(square 5)来调用这个函数。
6. 列表和操作Lisp中的列表是一种特殊的数据结构,可以包含多个元素。
可以使用(list)函数创建一个列表,并使用(car)和(cdr)函数来获取列表的第一个元素和剩余元素。
例如,(setq numbers (list 1 2 3)) 定义了一个包含三个元素的列表,并可以使用(car numbers)获取第一个元素。
Lisp 入门教程作者:Geoffrey J. Gordon <ggordon@> 1993/02/05 星期五修订:Bruno Haible <haible@ma2s2.mathematik.uni-karlsruhe.de>翻译:刘鑫 <March.Liu@>整理:张泽鹏 <redraiment@> 2011/06/24 星期五注意:这份 Common Lisp 入门教程是针对 CMU 环境编写,所以在其它环境运行 Lisp 时可能会有细节上的区别。
附:据我所知最好的 Lisp 书籍是:Guy L. Steele Jr. 《Common LISP: the Language》 Digital Press. 1984.第一版很容易阅读,第二版介绍了更新的标准。
(两个标准的差异很小,对于粗心的程序员没有什么区别。
)我还记得 Dave Touretsky 写了一本,不过我从来没读过,所以不能对那本书发表评论。
Symbols符号仅仅是字符串。
你可以在符号中包含字母、数字、连接符等等,唯一的限制就是要以字母开头。
(如果你只输入数字,最多再以一个连接符开头的话,LISP会认为你输入了一个整数而不是符号。
)例如:接下来我们可以做些事情。
(">"标记表示你向LISP输入的东西,其它的是LISP 打印返回给你的。
";"是LISP的注释符:";"后面的整行都会被忽略。
)有两个特殊的符号, t 和 nil 。
t 的值总是定义为 t,nil 的值总是定义为 nil 。
LISP用 t 和 nil 代表 true 和false。
以下是使用这个功能的 if 语句,后面再做详细说明:最后一个例子看起来很怪,但是没有错:nil 代表 false ,其它任意值代表 true。
(为了代码清晰,在没有什么特别原因的情况下,我们用t代表true。
Lisp教程一.Lisp基础知识二.对话框基础一.基本知识第1节--------------------------------------------------------------------------------基本知识AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50年代末期出现,是一种擅于处理串行文字(List of Processing),属第四代「人工智能(Artificial Intelligence)」的计目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令.AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成.是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言.程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响.数据及程序均统一以串行(List)结构表示.可直接调用几乎全部的AutoCAD命令.既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力.内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境.可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框.缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取.第2节--------------------------------------------------------------------------------函数(Function)在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下:(函数名称参数1 参数2....)e.g. (PRINC "AutoLISP Programming")每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应.左边开括号后紧随函数名称.函数名称与参数之间,或参数与参数之间须最少留一个空格.函数可有一个或多个参数(也可能没有参数),视该函数而定.函数名称不分大小写,即大小写字母视为相同.第3节--------------------------------------------------------------------------------数据型态(Data Type)整数(INT)没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648实数(REAL)带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5当数值在1与-1之间时,必须加上前导零 e.g. 0.05可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6字符串(STR)一般文字,其前后必须加上双引号" e.g. "AutoCAD"控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD"像素名称(ENAME)是指定给图文件内对象的指针(Pointer,为16进位的数字卷标)e.g. <Entity name:14e5180>像素名称在图文件内是唯一的,不会重复对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象档案(FILE)以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量选集(PICKSET)用SSGET等函数建立的一个或多个对象的集合或群组转化(V ARIANT)可将像素名称转换为可与ActiveX配搭使用的VLA-Object对象符号(SYM)用以储存静态数据的名称;例如内建或使用者定义的函数符号名称不分大小写,可由任意长度的可打印字符组成;但下列的字符除外:左括号( 右括号) 句点. 单引号' 双引号"分号;表(LIST)亦称为串行,是放在一对小括号( ) 内,一个或多个元素的有序集合e.g. (1.0 "Lisp" ( ) (5.6 7))元素可以是字符串,符号,整数或实数;也可以是另一个表元素与元素之间要用空格隔开,但元素与小括号之间则可以不隔空格为便于存取表内各元素,每个元素均有其序号;从表的左边开始,第一个元素序号为0,依此类推表的大小即为其顶层元素的数量(内层嵌套式的表,视为单一元素)点对(Dotted Pair)亦是表的一种;表内有2个元素,中间以一圆点分隔,且元素与圆点之间亦须以空格分开若表内没有任何元素,称为空串行或空表;以( ) 或(NIL) 表示第4节--------------------------------------------------------------------------------变数(V ariable)为程序执行中动态储存数据的符号名称;主要分为2类:区域(Local)变量又称为局部变量;该变量只在该程序段落中有效,不能为其它程序使用全域(Global)变量又称为整体变量;变量在所有程序段落中均可使用变量名称与符号的限制相同,使用时宜采用有意义及易于辨别的名称变量在赋值或使用前无须先行设定相同的变量可以储存不同型态的数据(但同一时间内只可储存一种型态)在指定新的数据之前,变量储存的内容会保持不变赋值将数据给予指定的变量储存以内建函数SETQ进行(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(SETQ 变量名称1 资料1 [变量名称2 资料2 ....] )e.g. (SETQ NAME "David" AGE 37 WEIGHT 72.5 POINT (LIST 10 20))在函数名称之后,各参数以两个一组,每组左边为变量名称,右边为存入变量的数据亦可将变量名称赋以空值(NIL) :e.g. (SETQ OCCUPA TION NIL)要显示变量所储存的数据,可以使用内建函数PRINC(可用于绘图模式的指令行或AutoLISP程序),其语法如下:(PRINC 变量名称)e.g. COMMAND : (PRINC NAME) Result : David"David"在绘图模式中,亦可于指令行中使用感叹号! 来显示变量内容,或作为指令选项的输入值;语法如下: !变量名称e.g. COMMAND : !NAME Result : "David"在Visual LISP的主控台窗口中,于提示符号_$ 后键入要显示的变量名称_$变量名称e.g. _$NAME要检查变量所储存的数据型态,可使用内建函数TYPE;语法如下:(TYPE 变量名称)e.g. COMMAND : (TYPE NAME) Result : STR若检查的变量没有储存数据,则会传回NIL第5节--------------------------------------------------------------------------------练习(Exercises)将四个坐标分别存入四个变量中,并以LINE或PLINE指令,配合四个坐标变量,画出正四边形. COMMAND : (SETQ POINT1 (LIST 0 0) POINT2 (LIST 0 10) POINT3 (LIST 10 10) POINT4 (LIST 10 0)) COMMAND : LINE ;直线段指令COMMAND : !POINT1 ;第一点(左下角起点)COMMAND : !POINT2 ;第二点(左上角)COMMAND : !POINT3 ;第三点(右上角)COMMAND : !POINT4 ;第四点(右下角)COMMAND : C ;自动联机至起点以关闭四边形画圆: 将圆心坐标及半径长度分别存入两个变量中(变量名称及数据型态自订)COMMAND : (SETQ CEN (LIST 0 0) RAD 20) ;将圆心点设为坐标0,0;半径为20COMMAND : CIRCLE ;执行划圆指令Specify center.... : !CEN ;在提示后以变量CEN响应输入Specify radius.... : !RAD ;在提示后以变量RAD响应输入将不同型态的数据,分多次存入相同的变数内;每次均以PRINC及TYPE函数显示变量内容及其数据型态COMMAND : (SETQ TEMP 1.2) ;将实数1.2存入变数TEMPCOMMAND : !TEMP Result : 1.2COMMAND : (TYPE TEMP) Result : REALCOMMAND : (SETQ TEMP "AutoLISP") ;将字符串存入变量TEMPCOMMAND : !TEMP Result : "AutoLISP"COMMAND : (TYPE TEMP) Result : STR二数值资料第1节--------------------------------------------------------------------------------基本运算加函数(+ [数值参数1 数值参数2 ....] )e.g. (+ 2.5 4 6) Result : 12.5函数的结果为各参数之总和若仅提供一个参数,则以0加上此参数的结果为返回值若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数减函数(- [数值参数1 数值参数2 ....] )e.g. (- 10 2 3) Result : 5结果为第一个(最左边)参数减去其右边各参数的总和若只提供一个参数,返回值为0减去该参数的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数乘函数(* [数值参数1 数值参数2 ....] )结果为所有参数的乘积若只提供一个参数,则返回值为该参数乘以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数除函数(/ [数值参数1 数值参数2 ....] )e.g. (/ 24 2 3) Result : 4结果为第一个(最左边)参数除以其右边各参数的乘积若仅提供一个参数,则返回值为该参数除以1的结果若没有提供任何参数则传回0;各参数须为整数或实数型态若所有参数均为整数,结果亦为整数;若其中一个参数为实数型态,结果会转换为实数注意: 在本篇教程中,各函数的数值参数,均可以变量(储存值只可以是整数或实数,且不可以是空值nil)取代第2节--------------------------------------------------------------------------------练习(Exercises)计算式(2+4)*3COMMAND : (* 3 (+ 2 4)) Result : 18计算式(50-8*5)/4COMMAND : (/ (- 50 (* 8 5)) 4) Result : 2注意: 上式的正确答案应是2.5,因为函数中的各参数均为整数,所以传回的结果亦为整数递增及递减递增(1+ 数值参数)e.g. (1+ 2) Result : 3递减(1- 数值参数)e.g. (1- 4) Result : 3三角函数(Trinagular Function)正弦值(SIN 弧度参数)e.g. (SIN 1) Result : 0.841471余弦值(COS 弧度参数)e.g. (COS 1) Result : 0.540302反正切值(A TAN 弧度参数)e.g. (A TAN 1) Result : 0.785398第3节--------------------------------------------------------------------------------其它数值处理次方值(EXPT 数值参数次方值)e.g. (EXPT 2 4) Result : 16若参数及次方值两个均为整数,返回值亦是整数;若其中一个为实数,结果为实数开方根(SQRT 数值参数)e.g. (SQRT 30) Result : 5.47723(ABS 数值参数)e.g. (ABS -123) Result : 123余数(REM [数值参数1 数值参数2 ....] )e.g. (REM 50 26 5) = (REM (REM 50 26) 5) Result : 4将参数1整除参数2的余数若参数多于2个时,则会将余数再整除下一个参数,再得出余数;依此类推若其中一个参数为实数时,则结果为实数;否则为整数最大公约数(GCD 数值参数1 数值参数2 )e.g. (GCD 81 57) Result : 3两个参数均必须为整数值型态自然对数(LOG 数值参数)e.g. (LOG 3.5) Result : 1.25276是EXP函数的反函数;传回值为实数型态自然反对数(EXP 数值参数)e.g. (EXP 1.25276) Result : 3.49999是LOG函数的反函数;传回值为实数型态第4节--------------------------------------------------------------------------------数值资料转型实数转整数(FIX 数值参数)e.g. (FIX 12.56) Result : 12只会截去小数部份(小数字不会4舍5入)整数转实数(FLOA T 数值参数)e.g. (FLOA T 12) Result : 12.0整数转字符串(ITOA数值参数)e.g. (ITOA -17) Result : "-17"数值转字符串(R TOS 数值参数[模式[小数字] ] )e.g. (RTOS 17.23333 2 3) Result : 12.266若不设定模式,则依系统变量LUNITS 的设定值转换数值为字符串若不设定小数字,则依系统变量LUPREC 的设定值转换模式设定值可以是下列数值之一:1 = 科学记号2 = 十进制3 = 英呎及十进制英吋4 = 英呎及分数位英吋5 = 分数当选用的模式为3,4或5,则传回的字符串受系统变量UNITMODE影响(ANGTOS 角度参数[模式[小数字] ] )e.g. (ANGTOS 0.785398 0) Result : "45"e.g. (ANGTOS 0.785398 4) Result : "N 45d E"若不设定模式,则依系统变量AUNITS的设定值转换数值为字符串若不设定小数字,则依系统变量AUPREC的设定值转换模式设定值可以是下列数值之一:0 = 度1 = 度/分/秒2 = 分度量3 = 弪度4 = 土地测量单位当选用的模式为4,则传回的字符串受系统变量UNITMODE影响反函数为ANGTOF;参阅第5篇教程第5节--------------------------------------------------------------------------------数值资料检查数值(NUMBERP 数值参数)e.g. (NUMBERP -3.45) Result : Te.g. (NUMBERP "AutoLISP") Result : nil注意: 在范例的传回值中,T表示函数的结果为真(成立),nil表示结果为假(不成立)负数值(MINUSP 数值参数)e.g. (MINUSP -3.45) Result : Te.g. (MINUSP 0) Result : nile.g. (MINUSP 3.45) Result : nil零值(ZEROP 数值参数)e.g. (ZEROP 0) Result : Te.g. (ZEROP 3.45) Result : nil其它应用最大值(MAX [数值参数1 数值参数2 ....] )e.g. (MAX -88 5 2) Result : 5若没有提供任何参数,则传回值为0最小值(MIN [数值参数1 数值参数2 ....] )e.g. (MIN -88 5 2) Result : -88若没有提供任何参数,则传回值为0第6节--------------------------------------------------------------------------------练习(Exercises)计算下列算式:(+ 1234567890 1234567890) Result : -1825831516上式中两个数值参数均为整数,而结果值大于整数型态所能容许之范围;固导致发生溢位问题,产生无效的结果.修正算式如下: 只要将其中一个参数改为实数型态即可.(+ 1234567890.0 1234567890) Result : 2.46914e+009(+ 9876543210 1234567890) Result : 1.11111e+010上式中两个数值参数均为整数,但其中一个(第一个)参数巳大于整数型态所能容许之范围;系统会自动将此参数先行转为实数型态才计算.计算下列算式:(FIX (SQRT (+ 1 (MAX 20 10 40 30)))) Result : 6---- 最先执行的是最内层的算式(MAX 20 10 40 30) ,求出最大值为40---- 其次执行加函数,将MAX函数所得的最大值加1,结果为41---- 再利函数SQRT,将41开方根,结果为6.4031---- 最后使用FIX函数,截去其小数字,得到最后的结果为6三程序设计第1节--------------------------------------------------------------------------------使用者定义函数是将一群表示式组合成一个函数或指令可应用于绘图模式的指令行提示,V isual LISP主控台,或供其它自定义函数内的表示式呼叫使用AutoLISP原始程序代码均以纯文字格式存盘,扩展名为LSP(2000版可编译成扩展名为FAS的档案可以一般文字编辑器进行开发,如DOS的EDIT,WINDOWS的WORD或WORDPAD等一个自定函数内最少要有一个表达式在原程序文件(LSP)里,自定义函数以DEFUN函数开始;其语法如下:(DEFUN [C:] 函数名称( [自变量串行...] [/ 局部变数串行...] ) 表达式...)在呼叫带有自变量的自定函数时,必须同时提供与定义函数时,同等数量的参数,使各参数传入自定函数的各自变量中自变量被视为一种特殊类型的局部变量,无法用于该自定函数以外的其它函数若自定函数中无须设定任何自变量,亦必须以空串行( )加在函数名称之后若有提供局部变量,必须以斜线/ 加在局部变量的开头(即使前面没有自变量串行)各自变量,斜线,局部变量之间要以空格分隔;但与左右小括号之间则不须以空格分开若自变量串行中有相同名称的自变量出现,则会忽略第一个以后的相同自变量;变数亦是一样若在函数名称前加上C:,表示该函数可以在绘图模式的指令行提示下,其执行方式与内建函数相同;亦可以在任何内建命令(执行中)的提示后,以通透方式执行(但须将函数名称包在一对小括号中) 若在函数名称前没有加上C:,在指令行提示下,必须将函数名称包在一对小括号中才可执行不可以在执行一自定函数时,以通透方式执行另一自定函数第2节--------------------------------------------------------------------------------加载程序自定函数在使用前,都要将其所在的程序文件(扩展名为LSP)加载才可执行ACAD.LSP程序文件(预设在SUPPORT子目录内)会在启动AutoCAD时自动加载(LOAD "程序文件名称" [加载失败] )e.g. (LOAD "TEST")若程序文件之文件名为LSP,则在程序文件名称之后,可以不加上扩展名若有需要,系统会顺序尝试其它的扩展名: VLX FAS LSP若程序文件不在系统的支持目录下,则需在文件名前加上目录路径注意: 必须以正斜线/ 或两个反斜线\\ 作为目录的分隔符可以在加载失败的参数中提供字符串,以供加载失败时显示;亦可提供有效的自定函数,该函数在加载程序文件失败时会被执行注意:在程序文件加载后,在提示行显示的返回值,一般是该程序文件中,最后被定义的函数名称或是在程序文件内没有包含在自定函数中,最后一个表达式的执行结果第3节--------------------------------------------------------------------------------练习(Exercises)启动文字编辑器,编写一AutoLISP程序作两个同心圆(第1个圆半径为50,第2个圆半径为80),程序代码如下所示:(DEFUN C: 2CIRCLE () (SETQ CEN (LIST 0 0) RAD 50)(COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘(C:\TEST.LSP)---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件加载COMMAND : (LOAD "C:/TEST")---- 在指令行提示后,输入程序(函数)名称执行COMMAND : 2CIRCLE程序说明1 使用DEFUN建立自定函数的名称,并用SETQ函数将中心点(LIST 0 0)存入变数CEN,半径(50)存入变数RAD中2 使用COMMAND函数执行AutoCAD内建指令CIRCLE,并以变量CEN(圆的中心点)及变数RAD(圆的半径)回应3 与第2行大致相同,但在指定其半径时,先将储存半径的变量加30,使划出半径为80的圆;注意最右边的关括号,与第1行DEFUN左边的开括号是一对的启动文字编辑器,开启TEST.LSP程序文件,复制2CIRCLE至新程序2C,并改为传入自变量方式执行;程序代码如下:(DEFUN 2C (CEN RAD) (COMMAND CIRCLE CEN RAD)(COMMAND CIRCLE CEN (+ RAD 30)))---- 输入后以纯文字格式存盘---- 在AutoCAD绘图模式的指令行提示后,用LOAD函数将程序文件重新加载---- 在指令行提示后,输入程序(函数)名称执行COMMAND : (2C (LIST 0 0) 50)第4节--------------------------------------------------------------------------------批注单行批注分号;表示在分号右边(同一行)的字符均为批注,程序执行时会将其忽略多行批注;| |;表示在两个批注符号中间所有字符皆为批注,即使字符跨越多行关系运算在各个关系运算中,都会传回一逻辑值;若关系成立,传回T,否则会传回nil各参数可以是字符串,整数或实数型态;若以字符串进行比较,则会以字符串的ASCII码为准若函数中只有一个参数,传回值恒为T等于函数(= 参数1 [参数2 ....] )会将参数1与其后各个参数比较,若全部相等则传回T,否则传回nil e.g. (= 2 2.0) Result : T不等于函数(/= 参数1 [参数2 ....] )若参数1不等于其后任何一个参数,即传回T e.g. (/= 1 2.0) Result : Te.g. (/= "a" CHR(65)) Result : Te.g. (/= 10 30 40 10 20) Result : T小于函数(< 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于右边的参数,即传回Te.g. (< 1 2) Result : Te.g. (< "a" CHR(65)) Result : T大于函数(> 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于右边的参数,即传回Te.g. (> 1 2) Result : nile.g. (> "a" CHR(65)) Result : nil小于或等于函数(<= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均小于或等于右边的参数,即传回Te.g. (<= 1 2) Result : Te.g. (<= 2 2) Result : Te.g. (<= "a" CHR(65)) Result : T大于或等于函数(>= 参数1 [参数2 ....] )各参数顺序以2个为一组比较,若各组左边的参数均大于或等于右边的参数,即传回Te.g. (>= 1 2) Result : nile.g. (>= 2 2) Result : Te.g. (>= "a" CHR(65)) Result : nil第5节--------------------------------------------------------------------------------逻辑运算且运算(AND [表达式....] )若各表达式的传回值均为T,函数即返回T 值;若其中一个传回值为nil,函数传回nile.g. (AND (< 1 2) (> 8 5)) Result : T或运算(OR [表达式....] )若各表达式的传回值均为nil,函数即返回nil 值;若其中一个传回值为T,函数传回Te.g. (OR (> 1 2) (> 8 5)) Result : T否定运算(NOT 表达式)若表达式的传回值为T,函数即返回nil 值;相反若表达式传回值为nil,函数传回T 可用于检查传回值是否为nil另有一NULL函数与NOT函数功能相似e.g. (NOT (< 1 2)) Result : nil练习(Exercises)COMMAND : (= (- 50 25) (SQRT 625)) Result : T设计一简单程序(名称为AIR),在呼叫程序时,检查传入的数值自变量(为空气污染指数)是否大于200(即严重空气污染)---- 启动文字编辑器,开启TEST.LSP程序文件,输入下列程序代码:(DEFUN AIR (NUM) (> NUM 200))---- 输入后存盘(纯文字格式)---- 在AutoCAD绘图模式的指令行提示符号后,使用LOAD函数重新加载程序文件COMMAND : (LOAD "C:/TEST")---- 在AutoCAD绘图模式的指令行提示符号后,输入自定函数名称及参数执行COMMAND : (AIR 175) Result : nilCOMMAND : (AIR 215) Result : T四流程控制第1节--------------------------------------------------------------------------------条件判断是利用条件函数,配合关系及逻辑运算所设定的一些准则,令程序自行分析,因应情况作出适当行动.单一条件(IF 条件表达式是表达式[否表达式] )函数先检查条件表达式,若其传回值为T,便会执行其后的是表达式若有提供否表达式,且条件表达式的传回值为nil,函数将不会执行(跳过)是表达式而执行否表达式若没有提供否表达式,且条件表达式的传回值为nil时,函数将不作任何事情IF函数可以巢状方式嵌套,即在是或否的表达式中加入另一个IF函数练习(Exercises)判断空气污染指数: 大于100 = V ery High, 51至100 = High, 26至50 = Medium, 25或以下= Low---- 启动编辑器,开启C:/TEST.LSP程序文件;新增AIR-1自定函数,程序代码如下:(DEFUN AIR-1 (NUM) (IF (> NUM 100) (PRINC "V ery High"))(IF (AND (> NUM 50) (<= NUM 100)) (PRINC "High"))(IF (AND (> NUM 25) (<= NUM 50)) (PRINC "Medium"))(IF (<= NUM 25)) (PRINC "Low"))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于100;若是则显示字符串V ery High响应2 用IF函数判断变量NUM是否大于50且(AND)小于或等于100;若是则显示High响应3 用IF函数判断变量NUM是否大于25且(AND)小于或等于50;若是则显示Medium4 用IF函数判断变量NUM是否小于或等于25;若是则显示Low5 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号IF函数的巢状练习: 修改上一课的程序练习,将多个IF函数合并成巢状嵌套---- 启动文字编辑器,开启C:/TEST.LSP程序文件---- 新增程序AIR-2,其程序代码如下:(DEFUN AIR-2 (NUM) (IF (> NUM 50) (PRINC (IF (> NUM 100) "V ery high" "High"))(PRINC (IF (> NUM 25) "Medium" "Low")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用IF函数判断变量NUM是否大于50;若条件成立(变量NUM大于50)时,再用另一个IF函数判断变量是否大于100;若条件成立(变量NUM大于100)时,使用PRINC函数显示字符串V ery High,否则显示High2 若在第1个IF函数判断中,条件不成立(变量NUM不大于50)时;再用另一个IF函数判断变量是否大于25;若条件成立(NUM大于25)时,显示字符串Medium,否则显示字符串Low3 是一个没有提供任何自变量的PRINC函数;用以抑制显示答案时尾部符加的nil 或重复的传回值;而最右一个关括号,是用以对应第1行最左边的开括号注意:第1行最后一个关括号是对应前面的PRINC函数,尾2的关括号则是对应IF函数(判断NUM是否大于100)第2行最后一个关括号是对应第1行的IF函数(判断NUM是否大于50),尾2的关括号则是对应PRINC 函数,尾3的关括号则是对应IF函数(判断NUM是否大于25)最右边的关括号是对应第1行最左边的开括号PROGN 函数在以上各范例中,执行的表达式均为单一的函数运算;若要在表达式中顺序执行一连串的函数,便要将各函数包含在一个PROGN函数内;函数的传回值会是该PROGN函数中,最后一个表达式的运算结果---- 修改TEST.LSP程序文件的AIR-1程序,第1个IF函数如下,其余的IF函数请自行修改e.g. (IF (> NUM 100) (PROGN (SETQ DISP "V ery High") (PRINC DISP)))注意: 最后一个关括号是对应前面的IF函数(判断变量NUM是否大于100)尾2的关括号是对应PROGN函数(用以包含SETQ及PRINC函数)尾3的关括号是对应PRINC函数的第2节--------------------------------------------------------------------------------条件判断多重条件(COND [ (条件表达式是表达式) ....] )函数会顺序检查各条件表达式;直到其中一个条件成立(传回T),即执行该条件式所对应的是表达式每个条件表达式只对应一个是表达式,而没有否表达式若条件式成立且执行对应的是表达式后,则不会再对余下的其它条件表达式进行检查若只有条件表达式而没有对应之是表达式,则只会传回条件表达式的逻辑值若没有提供任何条件表达式及是表达式,函数传回值恒为nil练习(Exercises)新增程序AIR-3,以改善上一课AIR-1程序;用一个COND函数判断多个条件表达式DEFUN AIR-3 (NUM) (COND((> NUM 200) (PRINC "Severe"))((> NUM 100) (PRINC "V ery High"))((> NUM 50) (PRINC "High"))((> NUM 25) (PRINC "Medium"))((> NUM 0) (PRINC "Low"))(T (PRINC "Cannot Check")))(PRINC))程序说明1 设定函数名称,并将数据存入自变量NUM内;用COND函数进行多重判断2 判断变量NUM是否大于200,若条件成立,则显示Severe 讯息;第3至6行依此类推7 注意条件式为一个T 字母,表示条件式恒为真(成立),显示讯息Cannot Check作用是当以上各条件式均不成立时(变量小于或等于0),即执行此一表达式第3节--------------------------------------------------------------------------------循环(Loop)配合条件判断,关系及逻辑运算,令程序不断重复一些动作,以提高效率及减少重复动作时的人为错误可以多个循环形成巢状(嵌套式)循环,即在一个循环内嵌套另一个(或多个)循环指定的重复次数必须为正整数,亦可以是储存正整数的变量名称重复指定次数(REPEA T 重复次数[表达式....] )e.g. (REPEA T 10 (PRINC "David")) ;重复显示David字符串10次重复(WHILE 条件表达式[是表达式....] )若条件表达式的传回值为T,即会顺序执行函数内各表达式各表达式顺序执行完后,程序会返回函数的开头,重新检查条件表达式的传回值若条件表达式的传回值为nil,函数内各表达式将不会被执行e.g. (SETQ COUNT 1) ;将1存入变数COUNT(WHILE (<= COUNT 10) ;WHILE函数并检查变量COUNT是否<=10(PRINC "David") ;若条件成立则以PRINC函数显示David字符串(SETQ COUNT (1+ COUNT))) ;变量COUNT递增1,并将新值重新存入变量COUNT中取代原值注意: 第4行最右边的关括号,是对应第2行WHILE函数的开括号无限循环又称为死循环,即循环的条件判断式传回值恒为T,令循环不断重复而无法结束;在上例中:---- 若WHILE函数的条件表达式设定为(T) ;即条件永远成立---- 不作SETQ函数,或不将变量COUNT递增;变量COUNT储存值恒久不变,导致条件式永远成立第4节--------------------------------------------------------------------------------练习(Exercises)编写一程序SUM并将自变量存在NUM变量内,计算1+2+3+4 ....至变数NUM的总和(DEFUN SUM (NUM) (SETQ COUNT 1 TOTAL 0)(WHILE (<= COUNT NUM)(SETQ TOTAL (+ TOTAL COUNT)COUNT (1+ COUNT)))(PRINC TOTAL) (PRINC))程序说明1 设定函数SUM并将自变量存入变量NUM,设定变量COUNT以将数目由1开始递增,变量TOTAL(储存总和)初始值为0。