LISP语法
- 格式:pdf
- 大小:143.21 KB
- 文档页数:14
LISP算术运算函数累加函数+(+ N1 N2 N3 …Ni)求任意个整数和实数的和。
(1)Ni可以是整型和实型常数、变量以及返回值为整数和实数的表达式,不允许为其他类型。
⽽且每⼀个变量必须有值,不能为nil。
(2)Ni全部为整型时,函数值为整型,但应防⽌整数越界;Ni全部为实型时,函数值为实型;Ni既有整型⼜有实型时,函数返回值为实型。
累减函数-(- N1 N2 N3 …Ni)如果只有⼀个参数(-N),相当于取与N符号相反的数;如果有多个参数,相当于N1-N2-N3-…-Ni。
同累加函数。
累乘函数*(* N1 N2 N3 …Ni)如果只有⼀个参数(* N),相当于1*N;如果有多个参数,相当于N1*N2*N3*…*Ni。
同累加函数。
累除函数/(/ N1 N2 N3 …Ni)如果只有⼀个参数(/ N),相当于N/1;如果有多个参数,相当于N1/(N2*N3*…*Ni)。
(1)⼀般调⽤规则同累加函数。
(2)如果参数全部为整型,函数值为整数。
但在执⾏整除运算时,商的⼩数部分被舍去,⽽不是四舍五⼊为整数。
(3)除了被除数N1外,N2,N3,…,Ni中不允许出现0。
加⼀函数1+(1+ N)相当于N+1。
(1)参数可以为整型或实型。
(2)该函数值虽然等同于(+ N 1),但加⼀函数的运算速度快,常⽤在步长为1的循环中。
减⼀函数1-(1- N)相当于N-1。
同加⼀函数。
绝对值函数Abs (abs N)求整型或实型常数、变量或表达式的绝对值。
平⽅根函数Sqrt (sqrt N)求整型或实型常数、变量或表达式的平⽅根。
(1)参数的值必须⼤于等于0。
(2)不管参数的值是整型或实型,Sqrt函数的返回值均为实型。
幂函数Expt (expt x y)求xy的值,x为底数,y为指数。
若x、y均为整型,函数值为整型;否则,函数值为实型。
指数函数Exp(exp x)求ex的值。
⾃然对数Log (log x )求⾃然对数lnx的值。
AUTOLISP实例常用函数(十数值数值…)返回:累计实数或整数数值(一数值数值…)返回:差值(* 数值数值…)返回:所有数值乘积(/ 数值数值…)返回:第一个数值除以第二个以后数值的商(= 表达式1 表达式2)比较表达式1是否等于式2,适用数值及字符串(>表达式1 表达式2)比较表达式1是否>大于表达式2(>= 表达式1 表达式2)比较表达式1是否大于等于表达式2(and 表达式1 表达式2…)返回:逻辑and的结果pi 常数∏,其值约为3.1415926(assoc 关键元素联合列表)根据关键元素找寻联合列表中关系信息(append 列表列表……)结合所有列表成一个列表(angle 点1 点2)取得两点的角度弧度值(car 列表)返回列表中的第一个元素,通常用来求X坐标(cdr 列表)返回:除去第一个元素后的列表(cadr 列表)返回列表中的第二个元素,通常用来求y坐标(caddr 列表)返回列表中的第三个元素,通常用来求Z坐标(command ”AutoCAD命令”…)超重量级函数,调用执行 AutoCAD命令(distance 点1 点2)取得两点的距离(eq 表达式1 表达式2)比较表达式1与表达式2是否相同,适用列表比较(实际相同)(entget 对象名称[应用程序列表])取出对象名称的信息列表(entdel 对象名称)删除或取消删除对象(entlast)取出图形信息中的最后一个对象(getdist [基点][提示])请求输入一段距离(getPoint [基点][提示])请求输入一个点的坐标(getreal [提示]请求输入一个实数(getstring [提示])请求输入一个字符串(inters 点1 点2 点3 点 4[模式])取得两条线的交点(length 列表)返回:列表内的元素数量(list 元素元素…)返回:将所有元素合并为一列表(max 数值数值…)返回:数值中的最大值(min 数值数值…)返回:数值中的最小值(nth n 列表)返回:列表的第n个元素(polar 基点弧度距离)按照极坐标法取得另一坐标点(progn 表达式1 表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数(setq符号1 表达式1[符号2表达式2]…)设定表达式结果给各符号(subst 新项旧项列表)返回:替换新旧列表后的列表(一)关于从选择对象中获取信息假设有一条直线:如右图所示:1:选择一个对象 (setq a (entsel))选择对象: (<图元名: 7ef860d8> (1054.61 606.392 0.0)) 2:获取图元名 (car a) 或(setq b (car a))<图元名: 7ef860d8>3: 获取坐标(cdr a)或(setq c (cdr a))((1054.61 606.392 0.0)) (此时为一个集合非坐标)(seta d (car c))(1054.61 606.392 0.0)4: 获取X坐标值 (setq X (car d)) 1054.61获取Y坐标值(setq Y (cadr d)) 606.392获取Z坐标值(setq Z (caddr d)) 0.05:关于图元的信息内容以直线为例(entget b)或 (setq d (entget d)) ((-1 . <图元名: 7ef860d8>) (0 . "LINE") (330 . <图元名: 7ef84cf8>) (5 . "123")(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10832.092 691.499 0.0) (11 1309.43 517.764 0.0) (210 0.0 0.0 1.0))大括号内12项,分别以括号括起。
lisp命令(defun c:rt ()(command "rotate"))旋转作者:翁政(defun c:ff ()(command "offset"))偏移(defun c:v ()(command "move"))移动(defun c:g ()(command "line"))直线(defun c:gg ()(command "pline"))多线(defun c:q ()(command "bhatch" "p" "s"))实体填充(defun c:cc ()(command "copy"))复制(defun c:c ()(command "circle"))圆(defun c:a ()(command "arc"))圆弧(defun c:f ()(command "fillet"))圆角(defun c:dt ()(command "dtext"))文字编辑(defun c:t ()(command "text"))文字(defun c:sc ()(command "scale"))比例缩放(defun c:tr ()(command "trim"))修剪(defun c:x ()(command "explode"))分解(defun c:ar ()(command "array"))陈列(defun c:e ()(command "_erase"))删除(defun c:cc1 ()(command "copy" "l" "" "@"))连续复制(defun c:www ()(command "_browser"))用IC连机,DOS调用内部命令(defun c:w ()(command "matchprop"))(defun c:d ()(command "_TXTALIGN"))对齐文字(defun c:dq ()(command "_dimaligned"))对齐标注(defun c: ()(command ""))(defun c: ()(command ""))-1.先选择弧,就可求得弧的半径和弧圆心的坐标。
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)是一个字母序列,如a b c;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:a b c()(a b c x y z)(a b(c)d)最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。
正如算数表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。
如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。
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(x1y1x2y2x3y3x4y4/)函数:给定四点计四点确定两直线之间的填挖方面积。
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----将横断面图中的断面线转换为平面图中的三维点线。
26.EZ—将指定点标高设置为当前标高。
(defun c:u1 ()(princ "\n设置角度")(setq p1 (getpoint "\n起点:"))(setq p2 (getpoint "\n终点:"))(command "ucs" "z" p1 p2 ))(defun c:u2 () (command "ucs" "w" ))(defun c:u3 ()(princ "\n设置角度")(setq p1 (getpoint "\n起点:"))(setq p2 (getpoint "\n终点:"))(command "ucs" "z" p1 p2 "plan" ""))(defun c:us () (command "ucs" "w" "plan" ""))(defun c:zd () (command "zoom" "d"))(defun c:hz ()(princ)(command "-layer" "f" "*" "t" "hatch" "" "DRAWORDER" "all" "" "b" "-layer" "t" "*" "") )(defun c:ep()(command "explorer"))(defun c:as ()(setq p1 (getpoint "\n起点:"))(setq p2 (getpoint p1 "\n下一点:"))(command "line" p1 p2 pause "trim" ""))(defun C:Pu (/ gnList doc groups g)(princ"\n此程序搜索不包含任何物体的空组并清除之\n")(princ)(setq doc (vla-get-activedocument (vlax-get-acad-object))) (setq groups (vla-get-groups doc))(vlax-for g groups(princ "\n分析组:")(princ (vla-get-name g))(if (= (vla-get-count g) 2)(progn(princ (strcat "......删除空组" (vla-get-name g)))(vla-delete g))))(command "purge" "all" "" "n"))(defun c:sd (/ a b ent ent2 elist etype oldval bltxt entdata btxt ostr pt oltxt)(princ "\n ******* 文字替换程序******* Writen by 赵")(princ "\n 请选择复制源文字目标:")(setq ent (nentsel))(if (= ent nil)(setq oldval (getstring "\n 请输入文字:" c))(progn(setqent2 entelist (entget (car ent))etype (cdr (assoc 0 elist)))(setq oldval (cdr (assoc 1 elist)))(princ "\n ")(princ "\n复制文字内容为: ")(princ oldval)))(setq q 9)(while q(princ "\n ")(setq bltxt (nentsel "\n请选择需要替换的文字目标:"))(if (= bltxt nil)(setq q nil)(progn(setq entdata (entget (car bltxt))btxt (cdr (assoc 1 entdata))ostr btxt)(setq elist (entget (car bltxt)))(setq etype (cdr (assoc 0 elist)));; (setq oltxt (car (assoc 1 elist)))(setq oltxt (cdr (assoc 1 elist)))(if (= etype "ATTRIB")(progn(setq pt (cadr bltxt))(command ".attedit" "" "" "" "" pt "" "V" "R" oldval "n") )(progn(setq btxt oldval)(entmod (subst (cons 1 btxt) (assoc 1 entdata) entdata))(if (setq bltxt (car (reverse (cadddr bltxt))))(entupd bltxt))))))(princ "\n原文字为:")(princ oltxt)(princ ". 已被替换为: ")(princ oldval)(princ " ."))(princ));(defun c:ef (/ p1 p2 ); (princ "\n画钢筋"); (setq p1 (getpoint "\n起点:")); (setq p2 (getpoint p1 "\n下一点:")); (setq clayer (getvar "clayer")); (command "layer" "m" "rein" ""); (command "pline" p1 "w" "40" "" p2; PAUSE); (setvar "clayer" clayer); (princ););(defun c:pu (); (princ); (command "purge" "all" "" "n"););(defun C:cf (); (princ "改变目标为指定层\n"); (setq p (ssget)); (setq 1("thin"); 2("text"); 3("dim"); ); (setq lay (getstring "输入目标层名: ")); (command "change" p "" "p" "la" lay ""););打开所有层;(defun c:laa ( )(command "layer" "on" "*" ""));copy layer entities to another layer;layer copy(defun c:lac (/ ss nm e la)(print "<拷贝到另一层> obj:")(setq ss(ssget))(setq nm (car (entsel "\n target objects for new layer:"))e (entget nm)la (cdr (assoc 8 e)))(command "copy" ss "" "0,0" "0,0" "change" ss "" "p" "la" la "") );设目标实体所在图层为当前层并关其它层(defun c:lao (/ e n n1 nn)(setq e (car (entsel "\nobject for layer/on:"))n (cdr (assoc 8 (entget e))) n1 n nn n)(while (setq e (car (entsel "\nobject for orther layer/on:"))) (setq n (cdr (assoc 8 (entget e)))nn (strcat nn "," n)))(command "layer" "s" n1 "off" "*" "" "on" nn ""));设目标实体所在图层(defun c:las (/ e)(setq e (car (entsel "\nobject for layer-set:"))lan (cdr (assoc 8 (entget e))))(command "layer" "s" lan ""));解锁目标实体所在图层;(defun c:lau (/ e n); (while (setq e (car (entsel "\nobject for unlock-layer:"))); (progn; (setq n (cdr (assoc 8 (entget e)))); (command "layer" "u" n "");)));(vl-load-com)(defun dxf(a b)(cdr(assoc a b)))(command"undo""group")(if(and(setq ss(ssget '((0 . "INSERT"))))(setq new(getstring "\n名称:"))(not(tblsearch "block" new)))(progn(setq old(dxf 2(entget(ssname ss 0))))(command "-insert" old '(0 0) "1""1" 0)(command "explode"(entlast))(command "-block" new '(0 0)"P" "")(setq j 0)(repeat(sslength ss)(setq e(ssname ss j)en(entget e)en(subst(cons 2 new)(assoc 2 en)en))(entmod en)(setq j(1+ j)))))(command"undo""end")(princ))(defun C:Z=0 ()(setvar "cmdecho" 0)(princ "\n正在处理图形数据,请稍候...")(command "_.UCS" "")(command "_.move" "_all" "" '(0 0 1e99) "" "_.move" "_p" "" '(0 0 -1e99) "") (princ "\nOK,已将所有图元的标高值即Z坐标归零.")(setvar "cmdecho" 1)(princ));end (defun C:Z=0 ())(defun c:os()(princ )(command "osmode" 695))(defun C:mk (/ ss )(princ "\nSelect objects: ")(setvar "blipmode" 1)(setq ss (ssget))(setq p1 (getpoint "\n起点:"))(setq p2 (getpoint "\n下一点:"))(command "mirror" ss "" p1 p2 "y" )(setvar "blipmode" 0))(defun C:OI ()(setvar "blipmode" 1)(setq ss (ssget))(setq d (getdist "\n距离<250>:"))(if (null d)(setq d 250.0))(setq p1 (getpoint "哪侧:"))(command "OFFSET" d ss p1 "")(setvar "blipmode" 0)(command "erase" "p" ""))(DEFUN C:Z0 (/ SSS1 n s1 old1 new1 s2 old2 new2 ) (prompt "\\n\\r 加载Z轴坐标归零程序。