AutoLISP 基础——认识自定义函数
AutoLISP 基础——认识自定义函数

2AutoLISP基本函数

;返回1.570796 ;返回-1.570796
二、AutoLISP 基本函数
▪ 讨论与练习 写出y x3 ax2 bx c的AutoLISP表达式
(Setq y (+ (expt x 3) (* a x x) (* b x) c))
写出x * y /(tgx a sin 2 y)的AutoLISP表达式
是整型数,实型数,表达式
(- <数1> <数2>…)返回第一个<数>与后面所有数的差
(* <数> <数>…) 返回所有<数>的乘积
(/ <数1> <数2> …)返回<数1>依次除以其他数后的商
(1+ <数>)
返回<数>有空格)
(1- <数>)
返回<数>减1后的值
(注意:1与-号之间不能有空格)
2、表达式求值规则:①整型数、实型数 和字符串其本身的值就是求值结果;② 表根据第一个元素进行求值
3、最好不要给AutoLISP一些内置函数名 及符号赋值。虽然是有效的,但保留符 号和函数将被重新定义
2.1 赋值与求值函数
▪ 2 再赋值函数
(set <变量> <表达式>)
功能:再赋值函数,给变量的值赋值的函数 格式:只能有两个参数,且对<变量><表达式>都要求值,
二AutoLISP 基本函数
▪ 引言
1 AutoLISP函数分为:系统内部函数和用户自定 义的外部函数
2 AutoLISP函数的调用:通过对标准表来实现, 一般格式: (函数名[参数1][参数2]…)
最新AutoLISP-函数大全资料

一、数学运算功能函数l(+ 数值数值…) 返回:累计实数或整数数值2(- 数值数值…) 返回:差值3(* 数值数值…) 返回:所有数值乘积4(/ 数值数值…) 返回:第一个数值除以第二个以后数值的商5(l+ 数值) 返回:数值+l6(1- 数值) 返回:数值-l7(abs 数值) 返回:数值的绝对值8(atan 数值) 返回:反正切值9(cos 角度) 返回:角度的余弦值,角度值为弧度10(exp 数值) 返回:数值的指数11(expt 底数指数) 返回:底数的指数值12(fix 数值) 返回:将数值转换为整数值13(float数值) 返回:将数值转换为实数值14(gcd 数值1 数值2) 返回:两数值的最大公因数15(log 数值) 返回:数值的自然对数值16(max 数值数值…) 返回:数值中的最大值17(min 数值数值…) 返回:数值中的最小值18 pi 常数∏,其值约为3.141592619(rem数值1数值2) 返回:M数值的相除的余数20(sin角度) 返回:角度的正旋值,角度值为弧度21(sqrt数值) 返回:数值的平方根二、检验与逻辑运算功能函数l(=表达式1表达式2) 比较表达式1是否等于式2,适用数值及字符串2(/=表达式1表达式2) 比较表达式1是否大于等于表达式23(<表达式1表达式2) 比较表达式1是否<小于表达式24(<=表达式1表达式2) 比较表达式1是否<一小于等于表达式25(>表达式1表达式2) 比较表达式1是否>大于表达式26(>=表达式1表达式2) 比较表达式1是否大于等于表达式27(~数值) 返回:数值的位not值,(1的补码)8(and表达式1表达式2…) 返回:逻辑and的结果9(boole函数整数整数…) 返回:位式布尔运算10(eq表达式1表达式2) 比较表达式1与表达式2是否相同,适用列表比较(实际相同)11(equal表达式1表达式2[差量])比较表达式1与表达式2是否相同,差量可省略(内容相同)三、转换运算功能函数l(angtof字符串[模式])返回:角度值的字符串转成实数2(angtos角度[模式[精度]])返回:角度转成的字符串值3(atof字符串)返回:字符串转成实数值4(atoi字符串)返回:字符串转成整数值5(cvunit数值原始单位转换单位)返回:数值转换单位后的值转换根据acad.nut文件6(distof字符串[模式])返回:根据模式将字符串转成实数值7(itoa整数)返回:整数转成字符串8(rtos数值模式[精度])返回:实数转成字符串9(trans点原位置新位置[位移])返回:转换坐标系统值四、列表处理功能函数1(append列表列表……)结合所有列表成一个列表2(assoc关键元素联合列表)根据关键元素找寻联合列表中关系信息3(car列表)返回列表中的第一个元素,通常用来求X坐标4(cadr列表)返回列表中的第二个元素,通常用来求y坐标5(caddr列表)返回列表中的第三个元素,通常用来求Z坐标6(cdr列表)返回:除去第一个元素后的列表7(cons新元素列表)返回:将新元素添加到列表8(foreach名称列表表达式)返回:将列表的每一元素对应至名称再根据表达式执行响应9(length列表)返回:列表内的元素数量10(list元素元素…)返回:将所有元素合并为一列表11(listp元素)返回:判断元素是否为一串12(mapcar函数列表1列表2…)返回:将列表1、列表2列表的元素配合函数,求得新列表13(member关键元素列表)返回:根据关键元素(含似后的列表14(nthn列表)返回:列表的第n个元素15(reverse列表)返回:将列表元素根据顺序颠倒过来的列表16(subst新项旧项列表)返回:替换新旧列表后的列表五、字符串、字符、文件处理函数l(ascii字符串)返回:字符串第一个字符的“ASCII”码2(chr整数)返回:整数所对应的ASCII单一字符串3(close文件名称)关闭文件4(open文件名模式)返回:打开文件代码,准备读取或写入信息5(read字符串)返回:列表中的字符串的第一组元素6(read-char[文件代码])返回:通过键盘或文件中读取单一字符7(read-line[文件代码])返回:经由键盘或文件中读取一行字符串8(strcase字符串[字样])返回:转换字符串大小写9(strcat字符串1字符串2…)返回:将各字符串合并为一个字符串10(strlen字符串)返回:字符串构成的字符数(即字符串长度)11(substr字符串起始长度)返回:取出于字符串‘12(wcmatch字符串格式)返回:T或nil,将字符串与通用字符进行比较13(write-char数值[文件代码])返回:将一ASCII字符写到文件或屏幕14(write-line字符串[文件代码])返回:将字符串写到文件或屏幕上六、等待输入功能函数l(getangle[基点][提示])请求输入十进制角度数值,响应一个弧度值提示及参考点可有可无2(getcorner基点[提示])请求输入另一矩形框对角点坐标3(getdist[基点][提示])请求输入一段距离4(getint[提示])请求输入一个整数值5(getkword[提示]请求输入“关键词”6(getorient[基点][提示])请求输入十进制角度,响应一弧度值不受angbase、angdir影响7(getPoint[基点][提示])请求输入一个点的坐标8(getreal[提示]请求输入一个实数9(getstring[提示])请求输入一个字符串10(initget[位]字符串)设定下次getxxx函数的有效输入七、几何运算功能函数7.l(angle点1点2)取得两点的角度弧度值7.2(distance点1点2)取得两点的距离7.3(inters点1点2点3点4[模式])取得两条线的交点7.4(osnap点模式字符串)按照捕捉模式取得另一坐标点7.5(polar基点弧度距离)按照极坐标法取得另一坐标点7.6(textbox对象列表)取得文字字符串的两个对角点坐标八、对象处理功能函数8.l(entdel对象名称)删除或取消删除对象8.2(entget对象名称[应用程序列表])取出对象名称的信息列表8.3(entlast)取出图形信息中的最后一个对象8.4(entmake对象列表)建立一个新的对象列表8.5(entmod对象列表)根据更新的信息列表更新屏幕上元体8.6(entnext[对象名称])找寻图面中的下一个对象8.7(entsel[提示])请求选取一个对象,响应包含对象名称及选点坐标的列表;8.8(entupd对象名称)更新屏幕上复元体图形8.9(handent图码)返回:图码的元体名称8.10(nentsel[提示])返回:BLOCK所含副元体对象信息列表8.11(nentselp[提示][点])返回:BLOCK所含副元体对象信息似4*4矩形表示)九、选择集、符号表处理函数9.l(ssadd[对象名称][选择集])将对象加入选择集或建立一新选择集9.2(ssdel对象名称选择集)将对象自选择集中移出9.3(ssget[模式][点1][点2]取得一个选择集9.4(ssget”X”[过滤列表])取得根据过滤列表所指定范围的选择集9.5(sslenth选择集)计算选择集的对象个数9.6(ssmemb对象名称选择集)响应对象名称是否包含于选择集内9.7(ssname选择集索引值)根据索引值取出选择集中的对象名称9.8(tblnext符号表名称[T])检视符号表,有效的符号表:”LAYER”、”LTYPE”、”VIEW”、”STYLE”、”BLOCK”9.9(tblsearch符号表名称符号)在符号表中搜寻符号十、AutoCAD相关查询、控制功能函数10.l(command”AutoCAD命令”…)超重量级函数,调用执行AutoCAD命令10.2(findfile文件名)返回:该文件名的路径及文件名10.3(getfiled标题内定档名扩展名旗号)通过标准AutoCAD文件对话DCL 对话框获得文件10.4(getenv”环境变量”)取得该环境变量的设定值,以字符串表示10.5(getvar”系统变量”)取得该系统变量的设定值,以字符串表示10.6(setvar”系统变量”值)设定该系统变量的值10.7(regapp应用类项)将目前的AutoCAD图形登记为一个应用程序名称十一、判断式、循环相关功能函数11.1(If<比较式><表达式1>[表达式2]检算比较式结果,如果为真,执行<表达式1>,否则执行<表达式2>11.2(repeat次数[<表达式><表达式>…])重复执行N次表达式11.3(While<比较式><表达式>…)当条件成立则执行表达式内容11.4(cond<比较式1><表达式1>多条件式的if整合功能<比较式2><表达式2><比较式3><表达式3>)11.5(prong表达式1表达式2…)连接其中的表达式为一组,常用于配合if、cond等函数十二、函数处理、定义、追踪与错误处理功能函数12.l(*error*字符串)程序错误时的警示信息12.2(alert字符串)以对话框式显示出警告字符串12.3(apply功能函数列表)将功能函数与列表结合后执行12.4(defun名称自变量列表表达式_.)自定函数或子程序12.5(eval表达式)返回:表达式的执行结果12.6(exit)强制退出目前的应用程序12.7(lambda自变量表达式)定义未命名的函数12.8(progn表达式1表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数12.9(quit)强制退出目前的应用程序12.10(tablet代码[列1列2列3方向])取用或建立对数字板的校调12.11(trace函数…)对函数设定追踪标记,辅助检错12.12(untrace函数…)对函数设定解除追踪标记十三、显示、打印控制功能函数l(gfaphscr)作图环境切换到图形画面2(grclear)暂时清除模前的屏幕画面3(grdraw起点终点颜色[亮显])暂时性的画出一条线4(grread[追踪])由输入设备读取追踪值5(grtext位置字符串[亮显])将字符串显示在状态列或屏幕菜单上6(grvecs向量列表[转置矩阵])暂时性的画出多条线7(menucmd字符串);提供在AlltOLISP中调用各菜单8(Prinl[表达式[文件代码]]将表达式打印于命令区或已打开的文件句柄字符则以“\”为前缀展开9(pinc[表达式[文件代码]]除句柄字符则不以”\”为前缀展外开其余同Prinl10(print[表达式[文件代码]]除表达式会往下一新行列出,及空一格外其余同prinl11(prompt信息)将信息显示于屏幕的命令区,并随后响应一个nil信息12(redraw[对象名称[模式]])重绘整张图或根据对象名称重绘该图形13(terpri)在屏幕上显示新列14(textscr)作图环境切换到文字画面15(textpage)清除文字画面文字类似DOS的cls命令16(vports)返回:窗口组态列表十四、符号、元素、表达式处理功能函数l(atom元素)如果元素不是列表,响应T,否则为nil2(atoms-family格式闲号列表])返回:一组己定义函数的符号列表3(boundp表达式)返回:T或nil,响应表达式是否有值存在4(minusp元素)返回:T或n儿元素是否为负值5(not元素)返回:T或n儿判定元素是否为ni16(null元素)返回:T或nil判定元素是否被赋予nil值7(numberp元素)返回:T或nil,元素是否为整数或实数8(quote表达式)响应表达式未检算前状态,同“‘”功能9(set符号表达式)将表达式结果设定给带单引号’符号10(setq符号1表达式1[符号2表达式2]…)设定表达式结果给各符号11(type元素)返回:元素的信息型态12(zerop元素)返回:T或nil,元素是否为0值十五、ADS、ARX、AutoLISP加载与卸载函数15.l(ads)返回:目前加载ADS程序列表15.2(arx)返回:目前加载ARX程序列表15.3(arxload应用程序[出错处理]))返回:加载ARX程序15.4(arxunload应用程序[出错处理]))返回:卸载ARX程序15.5(ver)返回:目前AutoLISP版本字符串15.6(loadLSP文件名[加载失败])加载AutoLISP文件(*.lsp) 15.7(xload应用程序[错处理])加载ADS应用程序15.8(xunloa应用程序[出错处理])卸载ADS应用程序十六、内存空间管理函数l(alloc数值)以节点数值设定区段大小2(expand数值)以区段数值配置节点空间3(gc)强制收回废内存4(mem)显示目前的内存使用状态5(xdroom对象名称)返回对象扩展信息允许使用的内存空间6(xdsize列表)返回对象扩展信息所占用的内存空间十七、其它重要的功能函数l(acad_colordlg颜色码旗号)显示出标准AutoCAD颜色选择对话框2(acad_helpdlg求助文件名主题)显示出标准AutoCAD求助对话框3(acad_strlsort字符串列表)作字符串列表排序4(bherrs)取得bhatch与bpcly失败所产生的错误信息5(bhatch点[选择集[向量]])根据Pickpoint选点方式调用bhatch命令,绘制选集区域的剖面线6(bpoly点[选择集[向量]])根据Pickpoint选点方式调用bpoly命令并产生一定域Polyline7(cal计算式字符串)执行如CAL计算功能十八、ADS、ARX外部定义的3D函数18.1(align自变量1自变量2....)执行如ALIGN命令各选项顺序18.2(c:3dsin模式3DS文件名)导入3DS文件18.3(C:3dsout模式3DS文件名)输出3DS文件18.4(c:background模式[选项])设定渲染背景18.5(C:fog模式[选项])设定渲染的雾效果18.6(C:light模式[选项])设定渲染的灯光控制18.7(c:lsedit模式【选项1】设定渲染的景物控制18.8(C:lslib模式[选项])管理景物图库18.9(c:matilb模式材质材质库名)管理材质数据库18.10(c:mirror3d自变量1自变量2……)执行如MIRROR3D命令18.11(C:psdrap模式)根据模式设定值(0或1),传唤psdrap命令18.12(C:psfill对象名称图案名称[自变量1[自变量2]])以POStSCript 图案填满18.13(c:psin文件名位置比例)插入一个Postscript(*.eps)文件18.14(c:render[渲染文件])执行渲染效果18.15(C:rfileopt格式自变量1自变量2自变量3…)设定执行渲染选项18.16(c:replay影像文件名影像类别[选项])展示影像文件TGA、BMP、TIF18.17(C:rmat模式选项)控管材质建立、贴附、编辑、分离18.18(c:rotate3d自变量1自变量2…)执行如ROTATE3D命令各选项顺序18.19(C:rpref模式选项[设定])渲染环境设定18.20(c:saveimg影像文件名影像类别[选项])储存图像文件TGA、BMP、TIF18.21(c:scene模式[选项])SCENE场景管理18.22(C:setuv模式选集自变量1自变量2…)SETUV贴图模式管理18.23(C:showmat自变量1)显示对象的材质贴附信息18.24(C:solprof自变量1自变量工..)建立3D实体的轮廓影像18.25(C:StatS[渲染信息文件])显示渲染信息统计信息十九、ADS、ARX外部定义的数据库相关函数19.l(c:aseadmin自变量1自变量2…)管理外部数据库19.2(c:aseexportt自变量1自变量2…)输出信息19.3(c:aselinks自变量1自变量2…)连接对象与信息19.4(c:aserow自变量1自变量2…)管理外部信息表格19.5(c:aseselect自变量1自变量2…)建立外部信息与对象选集19.6(c:asesqled自变量1自变量2…)执行SQL程序。
第5章 AutoLISP基本函数

第5章 AutoLISP基本函数函数是AutoLISP语言处理数据的基本工具,学习AutoLISP编程最主要的是要掌握AutoLISP语言系统内部函数和符号的基本用法。
如:函数的调用格式,即函数名、参数的个数及类型;函数的功能、求值情况及返回值类型等。
AutoLISP基本函数主要包括:数值函数、赋值与求值函数、表处理函数、字符串处理函数、逻辑运算函数和控制结构函数等。
5.1 数值函数数值函数用于处理整型数和实型数,数值函数包括:基本算术函数、三角函数、数据类型转换函数。
数值函数的返回值类型取决于参数表中参数的数据类型。
AutoLISP中数值计算要遵循整实原则,具体运算规则为:A.整整得整;B.实实得实;C.整实得实。
例:command: (/ 18 4 2) 返回: 2command: (* 4.5 2.0) 返回:9.0command: (+ 6 4.2) 返回:10.25.1.1 基本算数函数这类函数包括:+、-、*、/、1-、1+、abs、sqrt、min、max、expt、exp、log、gcd、rem 1) (+ 〈数〉〈数〉… )功能: 求表中所有整数或实数的和。
例如:Command:(+ 1.2 3.1 3.8)返回:8.12) (- 〈数〉〈数〉… )功能: 求表中第 1 个数减去后面所有数的差, 当表中只有一个数时, 返回这个数的相反数。
例如:Command:(- 8. 1 5)返回:3.1Command:(- 0.25)返回:-0.253) ( *〈数〉〈数〉… )功能: 求表中所有数的积, 例如:Command:( * 0.0174533 30)返回:0.5235994) (/ 〈数〉〈数〉… )功能: 求表中第1 个数除以后面所有数的商。
例如:cmnmand:(/ 10 5 2.0)返回:1.05) (1+ 〈数〉)功能: 求一个整数或实数加 1 的和。
例如:Command:(1+ 2.7)返回:3.76) (1- 〈数〉)功能: 求一个整数或实数减 1 的差。
AutoCAD二次开发实用教程第3章 AutoLISP基本函数

第3章 AutoLISP基本函数
3.1.1 计算函数 11.(LOG <数>) 该函数是EXP的反函数,返回值为<数>的自然对数值,其 数据类型为实型数。 例如:
(LOG (LOG (LOG (LOG
3) 返回1.098610 1) 返回0.00000 1.22) 返回0.198850 -90) 返回错误:没有为参数定义函数: -90
(ATAN -1.0) 返回-0.785398(弧度),即-45° 如果<数1>和<数2>都存在了,则返回<数1>/<数2>的反正切 值(单位为弧度)。 (ATAN 2.0 3.0) 返回值0.588002(弧度) (ATAN 2.0 -3.0) 返回值2.553590(弧度) (ATAN -2.0 3.0) 返回值-0.588002(弧度) (ATAN -2.0 -3.0) 返回值-2.553590(弧度)
第3章 AutoLISP基本函数
3.1.1 计算函数 5.(/ <数1> <数2>…) 本函数返回<数1>除以<数2>,再除以<数3>…依次做除法运 算的结果。如果仅提供了一个<数>,则返回<数>除以1的 结果。
各个<数>类型不同,计算结果不同,返回值类型也不同。 例如: (/ 9 2) 返回值4 (/ 9 2.0) 返回值4.5000 (/ 9 (/ 2 3)) error:divide by zero (/ 9 (/ 2.0 3)) 返回13.5000 (/ 4) 返回4 (相当于4÷1=4)
返回4.0700 返回9.0000 返回-1 返回9.0000 返回2.0
AUTO LISP函数参考

AUTO LISP函数参考1(10版本)以下为十年前纯手工录入的函数参考手册,以分享给爱好LISP这方面的朋友参考!AutoLISP提供了大量的预定义函数。
若将函数名(大小写都可)作为表中的第一个元素函数变元(若有的话)作为表中后面的元素,就可以调用那个函数。
本章按字母顺序列出AutoLISP所有基本函数。
用户会发现其中许多函数都是标准函数,可在LISP程序设计语言中找到。
还有一些函数是由 AutoCAD提供的且专用于交互图形环境。
1 FLATLAND 系统变量--与老版本的兼容性AutoLISP版本10支持AutoCAD的最新增强型三维图形功能,则时继续保证与AutoCAD老版本的兼容性。
FLATLAND系统变量就是用来控制该兼容性的。
当FLATLAND为零时,实现新三维功能;否则各函数操作与AutoLISP版本9的一样。
FLATLANDR的设置作用于下列AutoLISP函数:DISTANCE GRREAD POLARENTGET INITGET TBLNEXTGETDIST INTERS TBLSEARCHGETPOINT OSNAP在各函数说明中,已注明FLATLAND对上述函数起作用的方式。
2 ( + <数> <数> ...)这个函数返回所有<数>的总和。
其中的<数>可以是整型或实型的。
如果所有的<数>都是整数,其结果也是整数;如果其中有一个是实型的,那么其它整型数将转换为实型数结果将是实型数。
例如:(+ 1 2) returns 3(+ 1 2 3 4.5) returns 10.5(+ 1 2 3 4.0) returns 10.03 ( - <数> <数> ...)这个函数把第一个<数>减去第二个<数>,返回它们的差。
如果给定的<数>多于两个,那么将第一个<数>减去其后所有数之和,并返回最后的结果。
第三章AutoLISP的基本函数

• • • • • • • •
_$ (setq d 'c) C _$ (set d 2) 2 _$ c 2 _$ 注意:使用set函数时,符号的值不为符号出错。
• • • • • • • • • • • • • • •
_$ (setq d nil) nil _$ (set d 2) ; 错误: 参数类型错误: symbolp nil _$ 3.1.3禁止求值函数quote 等同于单引号(„),调用格式为(quote expr),例如 (quote (+ 6 5))等同 ‘(+ 6 5) 注意求值与不求值的区别 例如 $ (setq a '(+ 6 5)) (+ 6 5) _$ (setq a (+ 6 5)) 11 _$ 该函数在引用表中经常用到,例如
• • • • • •
_$ (last '(a b c)) C _$ (last '(2)) ;只有一个元素 2 _$ (last nil) nil
(nth n lst) 返回表的第 n 个元素,从零排序,其中n>=0,若n大于表的最大元 素号,返回nil。 • _$ (nth 2 '(a (a b) (c d) e)) • (C D) • _$ (nth 5 '(x y)) • nil 3.3.2表的构造与修改函数 5.
返回顶层第一个元素 一般性表 ls t为 点对 返回点对左元素 nil(空表) 返回nil
• • • • • • • • 2.
_$ (car '(x y z)) X _$ (car „((a b (c)) d 5)) (A B (C)) _$ (car '(0 . "LINE")) 0 _$ (car '()) nil (cdr lst)
C#自定义autolisp函数研究

C#自定义autolisp函数研究本人是lisp爱好者,初学C#对AutoCAD编程。
从教材上看到C#可以自定义autolisp函数。
教材例子:定义一个命名为DisplayFullName 的AutoLISP 函数。
虽然在 .NET 工程中定义的这个方法接收一个值,但是这个AutoLISP 函数期待两个字符串值以给出合适的输出。
加载 .NET 工程到AutoCAD 中。
预期运行效果如下:在命令提示中输入下列的命令:(displayfullname "First" "Last")下面是这个AutoLISP 函数执行后输出窗口中显示的:Name: First Last自定义代码如下:C#using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;[LispFunction("DisplayFullName")]public static void DisplayFullName(ResultBufferrbArgs){if (rbArgs != null)string strVal1 = "";string strVal2 = "";intnCnt = 0;foreach (TypedValuerb in rbArgs){if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text) {switch(nCnt){case 0:strVal1 = rb.Value.ToString();break;case 1:strVal2 = rb.Value.ToString();break;}nCnt = nCnt + 1;}}Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nName: " + strVal1 + " " + strVal2);}(注:本例子来自于《开发人员手册中文版》)我们看到这个例子中自定义的autolisp函数是(displayfullname),它接收两个字符串参数,没有返回参数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 4-2 (defun absv(x) ;定义一个绝对值函数
(if (>= x 0)
x ;单一变量表达式
(- x)
)
)
⑤ 如果我们需要定义一个匿名函数,则可以使用 lambda 函数,除
函数名"缺失" 外,其它都和 defun 相同。匿名函数在使用时定
义,普通的函数则可以在使用前,或任何你觉得需要的时候定
((lambda(x y z) (* x y z)) 3 4 5)是合理的。 ③ 参数可以是:数字(整数、实数)、字符串、T、nil、表(如果此
表是表、函数,就构成了复杂表,这就是lisp程序)、函数。 ④ 表可以作为函数的参数。如(+ 1 (- 5 2) 3)中,表(- 5 2)就作为+函数
的参数。 ⑤ 表的返回值也可以传递给其它变量,如(setq x (+ 1 2 3)) ⑥ 接受输入参数,如(- 5 2)中,-函数接受5和2两个参数。
是表。每个表都返回一个可由外层表达式使用的值。如果没有外
层表达式,AutoLISP 将则该值返回给AutoCAD 命令行。例如,
如下代码调用了三个函数:
(fun1 (fun2 arguments)(fun3 arguments))
;式 1-1
第一个函数 fun1 有两个参数,另两个函数 fun2 和 fun3 分别作为
2. 匿名函数 在一下表达循环的函数(比如 mapcar、forearch 等)的使用中,我 们往往见到使用 lambda 定义的匿名函数,这些函数内容我们也可以作 为一个"模块"定义为一个有名函数,然后对函数名进行引用,不过那样 会占用更多的资源,相对而言也就不够效率了。
七、 函数的作用机理
函数在不同情况下使用,其作用机理也是不同的。根据其和"外界"的 交互作用的不同,笔者将函数的作用机理归结为"返回值作用"和"过程作 用" 。
函数同为数据对象,就意味着我们可以像对待其他对象那样把它传递 给其他函数。这种性质对于 AutoLISP 这种自底向上程序设计至关重要。 AutoLISP 函数语法的描述遵循如下
这是 AutoLISP 中系统自带函数的一般性语法,也包括用其它语言定 义的函数。
所有 AutoLISP 表达式的格式都如下所示:
上式一对英文括号组成的表达式,称之为表,Lisp语言也称为表的语 言。表有两种形式,一种是“口袋式”表;一种是“函数式”表。前者 如’(0 0)表示一个2维点,前面加’表示此表不求值。如果不加‘,则通 常是认为是“函数式”表。“函数式”表如下:
① 结构特点:左括号(紧跟函数,函数所需要的参数,右括号)结束。 ② 函数是指:系统定义的函数、自定义的函数、匿名函数lambda。如
有重复使用代码的地方,定义函数是必要的,通常可以提高运行速 度。
1. 作为"模块"的自定义函数 程序应该有良好的结构,不仅仅是便于阅读,同时也对程序的运行 效率有一定影响。多数的高级语言通过模块和转移(goto)来完成程序 的结构化,和这些高级语言 不同的一点,AutoLISP 可以通过自定义函 数来完成这些要求,不需要编译就可以直接使用的代码,相比其他语言 来说,更具灵活性。作为"模块"使用的典型的自定义函数主要有两类, 一类是为对话框控件定义的动作函数,如: 例 6-1
综合以上描述,我们可以看到"函数"的基本组成: 输入值:一般称为参数; 表达式:函数体,是代码的集合,共同组成上面所说的"法则";
输出值:表达式对应输入值的(唯一)结果,通常称为"返回值 ";
封装:不同的语言,封装的意义也不同,在开放式的 AutoLISP 语言中, "封 装"并不意味着编译或打包,只使之以完整的函数体 驻留在内存中也应可以称为"封装" ;
二、 什么是函数 函数一词最早来源于数学,维基百科这样说:函数是将唯一的输出
值赋予每一输入的"法则"以及该输出值与对应输入值的集合。 在程序设计语言中,可以将一段经常需要使用的代码封装起 来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集 合,这就是程序中的函数。
从以上意义上,笔者建议使用"程序名(或部分字母)+特殊字符+ 函数名"这种命名方式,如 ca_main、tr:trans等。
虽然没有明确限制, 但一些前缀在 AutoCAD 中有自己的意义。比 如"ai_"AutoCAD(随系统附带的扩展函数),"acet_" AutoCAD ExpressTools 附带的扩展函数)等,另外一些著名的第三方 Lisp 扩展 库,都会有自己的"专属"前缀,使用时也都应该注意避免。
以上所说的是一般意义上的函数,也可以理解为有名函数,在 AutoLISP 中还有一种可以理解为"临时"定义的一次性的匿名函数 (lambda 表达式)即没有名字的函数,lambda 表达式基于数学上闭包 问题中ห้องสมุดไป่ตู้"演算"而得名,因为无名,所以无法重复调用,其它规则均不 违背。
六、 何时使用自定义函数
义。
⑥ 除此之外,给符号名赋值的 set 族函数也可以用来定义函数,这
个问题将在后面会阐述。
⑦ 只有函数接受参数输入,如(setq tt '(* x 3)),tt是一个表,不是函
数,故(tt 3)是错误的。(setq tt +)从此以后tt代表函数+,故(tt 1
2 3)是正确的。
⑧ 表可以作为参数传递给其它函数,换言之,函数每个参数都可以
细斟酌。 对于我们这些少量编程的 AutoCAD 的用户而言,过度复杂的函数
名也会给使用带来不便,所以,只要有限的标识,起到便于识别的目的 即可。
除非声明成局部变量,否则函数一经定义并加载,函数会驻留在 AutoCAD 的内存中,不同程序的同名函数会相互干扰,造成程序不可 用或结果错误,因此,在函数的命名时,也应考虑不同程序间函数的相 互避让。
这里所说的"符号"包括函数名、参数名和变量名。 需要说明的是,AutoLISP 函数名和变量名使用同一个命名空间(部 分其它的 LISP语言函数和变量使用不同的命名空间) 也就是说,变量 和函数重名时会冲突,后面定义(赋值)的会替代前面的。 可以看出,AutoLISP 的命名规则是很"宽松"的,除常见的字母数字 命名外,如"abc_1、+3+、xd::abc、<3"这类看似怪异的名字都是合法 的。 即便如此,也有些看似合法的名字是不能使用的,主要有: 系统的内部函数名,如 princ,car 等; 系统保留的常量名或其它符号,如 pi、t、nil、pause、^C 等; 系统有其它解释的符号组合,如 1e2(科学计数法) +3、-2(数 值)。 其它一些用于表达方向的字母(N、S、E、W)及表达角度的字母 (r、g、d)等 在某些时候也会产生意想不到的错误,所以,在使用的时候也应该 谨慎。因为 AutoLISP 对多字节字符的支持不是太好,所以,虽然理论 上可以使用汉字来作为函数名(或变量名),但实际上还是应该尽量避 免的,否则可能会出现无法预料的错误。 一些特殊的表达方式在 AutoLISP 中有特殊的含义,这些包括前缀c: 和函数名s::startup,前者表示定义了一个外部函数,而后在则定义了一个 自动执行函数。 我们用"c:3"来定义一个外部函数,使用命令"3"来执行,看起来这不 符合规则,似乎使用了数字"3"来作为函数名了,但其实不然,函数名是 "c:3" 。可以看出AutoLISP 中(或者说是 AutoCAD 中) 命令名是有独 立空间的。即便如此,我们也不建议这样用,一般说来,函数、变量, 尤其是命令的命名应 该能表达某种意义,向使用者和阅读者传递某种相 关的信息,而过度简单且不能引起联想的纯数字是无法承载这个任务 的。 从这个意义来说,函数名(或变量名)的命名每一个字节都应该仔
(function arguments)
;式 3-1
四、 函数的定义 一般说来,函数通过 defun 系列函数来定义,语法如下:
(defun sym argument-list expr ...) ;式 4-1
① defun 函数定义一个名为sym的函数(defun是系统定义的一个函 数,其功能就是用来用户定义自己的函数)。
② 函数名后面跟随参数列表argument-list,参数列表中对函数使用的 参数和局部变量进行声明,如果不申明任何参数和局部变量,必
须在函数名后提供一对空括号或者 nil (注:isp 语言中 nil 和一 对空括号是等价的)。不管是否需要声明参数,但"参数列表"项 是必须的,这是函数区别于赋值的一个重要特点。 ③ expr 为函数sym执行时的AutoLISP 表达式,可以是数字(整数、 实数)、字符串、T、nil、表、函数。见如下例 4-2 ④ AutoLISP 定义的函数本身是无法包括"可选参数"的,函数定义 时,参数数量一经声明,使用时就无法增减,否则就会出现"参数 太多(少)"的错误。例如: 例 4-1 (defun tan(x) ;定义一个正切函数,函数名 tan,有一个参数 x (/ (sin x) (cos x)) ;函数体 ) 使用这个函数时,必须而且只能输入一个变量,否则出错。而系统 自己定义的函数,参数的数量可是变的,如+。
可以经常调用:这是"函数"定义的一个基本要求,不能经常调用 就不必封装成函数了。
三、 AutoLISP 函数表达式 与很多的高级语言不同,函数也是AutoLISP(注:所有种类的Lisp