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轴坐标归零程序。
Lisp语言的基本语法与应用Lisp(List Processing)是一种函数式编程语言,它以列表为基础数据结构并使用S表达式(S-expression)进行编程。
本文将介绍Lisp语言的基本语法和应用。
一、基本语法1. 原子(Atom):Lisp的基本数据单位,可以是数字、字符串或符号。
例如,数字1、字符串"Hello, World!"和符号'hello都是Lisp的原子。
2. 列表(List):Lisp的核心数据结构,由左括号、元素列表和右括号组成。
列表中的元素可以是原子,也可以是嵌套的列表。
例如,(12 3)和('a ('b 'c))都是合法的Lisp列表。
3. 函数调用:Lisp通过括号表示函数调用,函数名位于第一个元素位置,后跟参数列表。
例如,(+ 1 2)表示调用加法函数,将1和2相加。
4. 定义变量:Lisp使用defvar或setq关键字用于定义变量。
defvar用于定义全局变量,setq用于定义局部变量。
例如,(defvar *pi* 3.14)定义了一个全局变量*pi*,(setq x 10)定义了一个局部变量x并赋值为10。
二、基本应用1. 计算器:Lisp提供了基本的数学运算函数,例如加法(+),减法(-),乘法(*)和除法(/)等。
可以通过使用这些函数进行算术计算。
2. 条件判断:Lisp中的条件判断使用if函数,语法形式为(if condition then else)。
当condition为真时,执行then部分的代码,否则执行else部分的代码。
例如,(if (> x 0) (print "x is positive") (print "x is negative"))根据变量x的值输出不同的结果。
3. 循环:Lisp的循环结构通过使用循环宏(loop macro)实现。
lisp经典语句数值设置默认数值(if (= (setq th (getreal "输入墙厚度:(默认为0.25):")) nil) (setq th 0.25))设置当前环境(setvar "cmdecho" 0) ;不显示提示文字(setvar "plinewid" 0.2 ) ;设置绘图线宽为0.2(setvar "osmode" 0) ;设置当前捕捉为关闭状态(command "undo" "be" "")恢复上一个命令(command "text" "c" pt3 hgt ang1 txt1) 添加文字信息在意图面(command "text" "c" pt3 hgt ang1 txt1)(DEFUN C:szzt()(command "style" "细等线体" "方正细等线简体" "0" "1" "0" "n" "n" ) ;标注文字样式(command "style" "中等线体" "方正中等线简体" "0" "1" "0" "n" "n" ) ;文字样式(command "style" "宋体" "方正书宋_GBK" "0" "1" "0" "n" "n" ) ;标注文字样式(command "style" "黑体" "黑体" "0" "1" "0" "n" "n" ) ;标注文字样式(command "style" "HZ" "txt,hztxt" "0" "0.8" "0" "n" "n" "n")(princ "\n文字样式已设定!"))(DEFUN C:tdc()(COMMAND "LAYER" "M" "HX" "C" "1" "" "")(COMMAND "LAYER" "M" "LH" "C" "3" "" "")(COMMAND "LAYER" "M" "ZX" "C" "2" "" "")(COMMAND "LAYER" "M" "绿化占地" "C" "3" "" "")(COMMAND "LAYER" "M" "道路占地" "C" "1" "" "")(COMMAND "LAYER" "M" "建设用地" "C" "7" "" "")(COMMAND "LAYER" "M" "解算" "C" "4" "" "")(COMMAND "LAYER" "M" "用地范围线" "C" "7" "" "")(COMMAND "LAYER" "M" "边界线" "C" "4" "" "")(COMMAND "LAYER" "M" "勘界线" "C" "6" "" "")(COMMAND "LAYER" "M" "利用" "C" "16" "" "")(COMMAND "LAYER" "M" "外业" "C" "5" "" "")(COMMAND "LAYER" "M" "图框" "C" "7" "" "")(COMMAND "LAYER" "M" "现状地形" "C" "5" "" "")(COMMAND "CLAYER" "解算"))(defun c:hzhj)(setq pt11(getpoint "\n请指定点:"))(command "text" "m" pt11 10 0 "合计")(command ""))(command "_text" "j" "mc" (getpoint "\n点取总面积标注点:")3 0 (rtos sumArea 2 3))(command "style" "细等线体" "方正细等线简体" "0" "1" "0" "n" "n" )(defun maketext (txt pt)(entmake (list '(0 . "TEXT") (cons 10 pt) (cons 40 hzg) (cons 1 txt) (cons 11 pt) (cons 72 1) (cons 73 2) '(41 . 0.8))))(defun c:hzhj)(setq pt9(getpoint "\n请指定点:"))(command "text" "m" pt9 10 0 "小计")(command ""))(setq s1 (getint "输入距离A:(100)"))(setq s2 (getint "输入距离B:(40)"))(if (= s1 nil) (setq s1 100))(if (= s2 nil) (setq s2 40) )(setq p1 (getpoint"\n点取角点坐标"))(setq p1 (p-zs p1))(setq xx (car p1))(setq yy (cadr p1))(setq p2 (list (+ xx 10) yy))(setq p3 (list (+ xx 10) (+ 10 yy)))(setq p4 (list xx (+ yy 10)))(command "pline" p1 p2 p3 p4 "c" "")(defun c:hd()(setvar "osmode" 33)(setq pX1 (getpoint "\n点选点A<回车退出>:"))(setq pX2 (getpoint "\n方向点B:"))(setq wzjd (angtos (angle pX1 pX2) 1 4))(setq aNGX (angle pX1 pX2))(SETQ AA (rtos angX 2 6))(command "_text" "j" "mc" (getpoint "\n请选取标注点:") 3 wzjd AA) )(defun c:tybj (/ sel int rad dat)(if (and (setq sel (ssget '((0 . "CIRCLE"))))(setq int 0rad (getdist "\n半径:")))(repeat (sslength sel)(setq dat (entget (ssname sel int))int (1+ int))(entmod (subst (cons 40 rad) (assoc 40 dat) dat))))(princ))(defun c:wzg0(/ ent ents ang)(princ "选择要修改的文字,可多选")(setq ss (ssget '((0 . "*TEXT"))))(setq ang (getangle "\n输入角度:<0>"))(if (= ang nil)(setq ang 0))(setq k 0)(repeat (sslength ss)(progn(setq ent (ssname ss k))(setq ents (entget ent))(setq ents (subst (cons 50 ang) (assoc 50 ents) ents)) (entmod ents)(entupd ent)(setq k (1+ k))))(princ))。
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。
如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。
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语法分析本⽂参考⾃vczh的《》。
LISP的表达式是按照前缀的形式写的,⽐如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)(+ 3 4)),1 + 2会写成(+ 1 2)。
LISP语⾔的语法如下形式:1.Operator = “+” | “-” | “*” | “/”2.Expression = <数字> | ”(”Expression”)” | “(”Operator Expression Expression”)”我们根据以上两条语法规则来写代码:// LISP语法分析器#include <iostream>#include <string>using namespace std;// 检测是否是空⽩符bool IsBlank(char ch){return ch == '' || ch == '\t';}// 检测Text是否是Stream的前缀// 如果是前缀,则返回true,并将pos前移Text.size()个字符// 如果不是前缀,则返回false// 此函数⼀开始会过滤掉Stream开头的空格bool IsPrefix(const string& Stream, int& pos, const string& Text){int read = pos;// 过滤空⽩符while (IsBlank(Stream[read])){++read;}// 不能写为:// while (IsBlank(Stream[read++]));// 因为这样写会导致read⾄少加1if (Stream.substr(read, Text.size()) == Text) // 如果是前缀{pos = read + Text.size();return true;}else{return false;}}// 检测Stream开头是否是操作符+、-、*、/// 是的话,函数返回实际的操作符,并将pos便宜到操作符之后// 否则返回0// 判断语法1:Operator = “+” | “-” | “*” | “/”char IsOperator(const string& Stream, int& pos){if (IsPrefix(Stream, pos, "+")|| IsPrefix(Stream, pos, "-")|| IsPrefix(Stream, pos, "*")|| IsPrefix(Stream, pos, "/")) // 如果开头是操作符{return Stream[pos - 1]; // 如果是的话,pos已经向前偏移了}else{return0;}}// 表达式结构体struct Expression{int Result; // 返回表达式结果string Error; // 返回错误信息,没错误则为空int Start; // 错误发⽣的位置Expression() : Result(0), Start(0) {}};// 检测Stream开头是否是数字,如果是,则将pos便宜到数字之后// 函数返回Expression// 判断语法2中的第⼀部分:Expression = <数字>Expression GetNumber(const string& Stream, int& pos){Expression Result;bool GotNumber = false;int read = pos;// 过滤空⽩符while (IsBlank(Stream[read])){++read;}while (true){// 依次读⼊⼀个字符char ch = Stream[read];if (ch >= '0' && ch <= '9'){Result.Result = Result.Result * 10 + ch - '0';GotNumber = true;++read;}else{break;}}if (GotNumber){pos = read;}else{Result.Error = "这⾥需要数字";Result.Start = read;}return Result;}// 检测Stream开头是否是表达式// 如果是,则将pos前移到表达式后// 实现语法2:Expression = <数字> | “(”Expression“)” | “(”Operator Expression Expression“)”Expression GetExpression(const string& Stream, int& pos){int read = pos;// 检测开头是否是数字// 语法2第⼀部分:Expression = <数字>Expression Result = GetNumber(Stream, read);if (!Result.Error.empty()) // 如果开头不是数字{if (IsPrefix(Stream, read, "(")) // 检测是否"("开头{// 将Result的Error清空Result.Error.clear();char Operator = 0;if ((Operator = IsOperator(Stream, read)) != 0)// 如果是操作符,语法2第三部分:Expression = “(”Operator Expression Expression“)” {// 获取左参数// 递归调⽤Expression left = GetExpression(Stream, read);if (!left.Error.empty()){return left;}// 保持当前readint rightRead = read;// 获取右参数// 递归调⽤Expression right = GetExpression(Stream, read);if (!right.Error.empty()){return right;}// 根据操作符Operator进⾏计算switch (Operator){case'+':Result.Result = left.Result + right.Result;break;case'-':Result.Result = left.Result - right.Result;break;case'*':Result.Result = left.Result * right.Result;break;case'/':if (right.Result == 0) // 除数为0{Result.Error = "除数为0";Result.Start = rightRead;}else{Result.Result = left.Result / right.Result;}break;default: // 这种情况不会发⽣,因为前提是Operator,所以只有+、-、*、/四种情况 Result.Error = "未知的操作符";Result.Start = read;return Result;}}else// 如果不是操作符// 语法2的第⼆部分:Expression = “(”Expression“)”{// 获取表达式Result = GetExpression(Stream, read);// 如果获取失败,则直接返回if (!Result.Error.empty()){return Result;}}// 检测是否有配套的")"if (!IsPrefix(Stream, read, ")")){Result.Error = "此处缺少右括号";Result.Start = read;}}}// 如果没有出错,则更新posif (Result.Error.empty()){pos = read;}// 检测是否有配套")"时,如果不存在,可以直接将Result返回// 这样在后⾯就不⽤检测是否出错了,因为前⾯凡是出错的情况// 都返回了,这样就不⽤检测了,⽽直接更新pos: pos = readreturn Result;}// 测试int main(){while (true){string Stream;cout << "输⼊⼀个LISP表达式" << endl;getline(cin, Stream);int pos = 0;if (IsPrefix(Stream, pos, "exit")){break;}pos = 0;Expression Result = GetExpression(Stream, pos);if (!Result.Error.empty()){cout << "表达式错误" << endl;cout << "位置:" << Result.Start << endl;cout << "错误信息:" << Result.Error << endl;}else{cout << "结果:" << Result.Result << endl;}}return0;}下⾯对程序代码解释如下:数据结构程序中⽤string型的字符串Stream来存储⽤户输⼊的表达式,int型的pos 作为当前扫描的位置。
一.DRAW_LISP --------------畫圖指令......................... 71.1 Circle -------畫圓71.2 Screw_top -------畫正面牙孔(上視圖) 71.3 Screw_bottom -------畫背面牙孔(上視圖) 71.4 Sink_head -------畫沉頭孔(上視圖) 71.5 Locate -------畫合銷孔(上視圖) 71.6 Drill hole -------畫鑽孔(側視圖) 81.7 Bolt hole -------畫螺絲孔(側視圖) 81.8 Sink head hole -------畫沉頭孔(側視圖) 81.93_view -------三視圖輔助畫線81.10Wire_cut hole -------畫線割穿線孔91.11Wire_cut hole_1 -------畫線割穿線孔91.12Circle_SP -------畫圓形孔之線割穿線孔91.13Layout -------多層複製91.14Slot -------畫長形孔101.15Middle line -------畫兩條平行線或平行圓(弧)的中心線... 101.16Copies -------以圓心為放置參考點的多重拷貝101.17Divide_1 -------用點等分兩點間的距離10二.MODI_LISP --------------編修指令........................ 122.1 Change layer -------圖元之圖層變更122.2 Change color -------圖元之顏色變更122.3 Change LType -------圖元之線形變更122.4 Stoc -------弧變圓122.5 Change diameter -------改變圓或弧的直徑132.6 Sort hole -------調整圓.弧.圖區或線的中心位置為整數.. 132.7 Adjust line -------調整兩平行線之距離為整數132.8 Correct -------圖元對齊基準點132.9Offset_1 -------偏移並刪除原圖元132.10Mirror_1 -------選兩平行線鏡射原圖元142.11Move_C 2 C -------以兩圓心為基准移動圖元142.12Ear -------處理上視圖的圓弧形掛台142.13Ear_side view -------畫出掛台側視圖152.14Change text -------改變文字162.15 Reverse text -------將數字文字減去輸入值162.16Change Text height -------改變文字高度162.17Change Text style -------改變文字字形172.18Distance -------測兩平行線間距离172.19Pline_Join -------串接多組聚合線172.20 Total circle -------統計相同直徑圓的數量172.21 Total length -------計算圖元長度172.22 Dupli-line -------尋找重複圖元182.23 Select -------圖元篩選18三.DIE_TLS --------------模具工具.......................... 193.1 Bending-len -------計算彎曲展開長度193.2 Die block -------連續模自動排板193.3 Auto draw -------自動畫各模板的孔203.4 Total Spring -------計算彈簧數量203.5 Make Layer -------分段製造模板圖層203.6 Parts -------畫標準零件203.7 Spring -------畫彈簧213.8 Big ARC -------找大圓弧213.9 CW -------將圓孔轉成線割用聚合線213.10CW1 -------將單個圓孔轉成線割用聚合線213.11 GC -------將圓孔轉成線割用聚合線213.12 GC1 -------將單個圓孔轉成線割用聚合線223.13 WC1 -------將異形孔轉成線割用聚合線223.14 WC out circle -------將單個外形圓轉成線割用聚合線223.15 Dxf Order_ R12 -------將線割聚合線存成dxf檔223.16 Quick M/C -------轉M/C加工程式233.17 Draw out -------存出模板圖紙233.18 MTL_List -------生成材料表233.19 MTL_List_all -------生成件號清單233.20 Parts_List -------生成零件表23四.DIM --------------標注尺寸.............................. 244.1 Code name -------標注各孔加工代號244.2 Grid -------制加工說明表244.3 Move code -------移動相同孔加工代號254.4 Code name1 -------標注各孔加工代號254.5 Grid_1 -------制加工說明表及坐標格254.6 Insert GD -------插入零件屬性格264.7 Dim Hole -------各類孔加工標注264.8 Mill_top -------標注正面消深274.9 Mill_bottom -------標注背面消深274.10 Auto_DIM -------座標式自動標註尺寸274.10-01 ................................... * ORG Pt * -----原點274.10-02 .................................... Txt hight -----字高284.10-03 ................................. Accuracy -----小數精度284.10-04 ........... H_V dim -----同步標註圓的水平與垂直圓心座標284.10-05 ... Hor_line -----點取水平標註位置並抓線的兩端點做標註284.10-06 ... Ver_line -----點取垂直標註位置並抓線的兩端點做標註284.10-07 ......................... H&V EDIT -----編輯座標尺寸位置294.10-08 ............. H level -----點取水平標註位置並選取圓標註294.10-09 ............. V level -----點取垂直標註位置並選取圓標註294.10-10 ............................ H dim -----逐一標註水平尺寸294.10-11 ............................ V dim -----逐一標註垂直尺寸294.10-12 ................... Horizon -----選取圓的圓心做水平標註304.10-13 .................. Vertical -----選取圓的圓心做垂直標註304.11 Geo_code -------標注几何公差基准代號304.12 Geo_box -------標注几何公差值304.13 Tolerances -------標注公差值304.14 Tolerances_1 -------插入公差值304.15 Chamfer_1 -------標注倒角314.16 Measure_dim -------產生尺寸標號及鉗工自檢表314.17 Cg DIM_lay -------變更圖元到尺寸層314.18 Flow -------指定加工流程314.19 Bubble -------標注件號气球32五.LAY --------------模板圖層控制.......................... 335.1 Sngllay -------開單一圖層335.2 SnglBLK -------開單一模板圖層335.3 SnglBK1 -------開單一模板圖層335.4 Lay set -------設置工作層335.5 Lay THAW -------解凍輸入圖層335.6 Lay FRZ1 -------選取凍結圖層335.7 Lay FREZ -------凍結輸入圖層345.8 Lay lock -------鎖護圖層345.9 Lay unlk -------解鎖所有圖層345.10 Switch Lay C -------模板圖層切換為C層345.11 Switch Lay F -------模板圖層切換為F層345.12 Switch Lay M -------模板圖層切換為M層34六.未顯示在功能表之功能鍵.................................. 346.1 SS -------打開部分鎖點功能346.2 FF -------執行R=0的FILLET指令346.3 MM -------執行無鎖點模式的MOVE指令346.4 PP -------將所有圖層顏色設為白色346.5 CC -------設定當前層為C層356.6 CF -------設定當前層為F層356.7 CM -------設定當前層為M層356.8 PG -------連續執行兩次PURGE指令356.9 Q -------彈出模板圖層控制功能表356.10 Shift + 右鍵 -------彈出座標式自動標註尺寸功能表... 356.11 Ctrl + 右鍵 -------彈出各類孔加工標注功能表35一.Draw_lisp --------------畫圖指令1.1 Circle -------畫圓●範例:Diameter〈內定值〉:直徑Center point〈Press ENTER for none〉:插入點 (按 ENTER 結束)●說明:1.按ENTER可重複指令。
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)获取第一个元素。