LISP程序课件最新.ppt_第1页
LISP程序课件最新.ppt_第2页
LISP程序课件最新.ppt_第3页
LISP程序课件最新.ppt_第4页
LISP程序课件最新.ppt_第5页
已阅读5页,还剩162页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章绪论 LISP LIStProcessinglanguage 是一种计算机表处理语言 是迄今为止人工智能领域应用最为广泛的一种程序设计语言 60年由美国麻省理工学院的J McCarthy提出 LISP语言又称符号式语言 SymbolicLanguage 函数式语言 functionallanguage 在LISP语言中 最基本的数据类型是符号表达式 symbolicexpression LISP程序看起来是一个一个的函数调用 LISP语言的一个突出的特点是程序和数据二者都取符号表达式的形式 也就是说一个LISP程序可以把另一个LISP程序作为它的数据处理 LISP语言的优势是处理表形式的数据 知识工程 知识可方便地表达成表的形式 这就是LISP语言在人工智能科学领域广泛应用的原因 AutoLISP语言是一种嵌入在AutoCAD内部的LISP编程语言 从AutoCAD2 18版开始提供 从AutoCAD14有了VisualLISP的试用版 AutoCAD2000有了VLISP1 0版 为了提高AutoCAD的使用效率 需要对其进行二次开发 以满足具体的应用要求 从早期的DXF文件 利用其他语言开发 SCR文件 批处理 过渡到AutoLISP AutoCAD二次开发工具的发展 由于AutoCAD实体数据是以表的形式存储的 VLISP语言二次开发效率最高 VLISP及其相关的内容 二次开发一个重要的工作是提取图形数据库数据 分析处理 VLISP的开放接口 DOS 其它高级语言 WINDOWS参考书 用VisualLISP开发AutoCAD2000应用程序 郭建峰编著 人民邮电出版社 AutoCAD2000高级应用与VisualLISP开发宝典 汤峻编著 人民邮电出版社 AutoCAD2000帮助 AutoLISP教程 刘银远编著 北京希望电脑公司 AutoCAD使用手册 没有一本书讲清所有的内容 第二章AutoLISP概述 2 0AutoLISP表达式AutoLISP程序由一系列表达式组成 在表达式中又包含其它数据类型 表达式和数据类型是AutoLISP程序的基础 AutoLISP没有语句的概念 AutoLISP表达式的格式如下所示 函数参数 每个表达式都以一个左括号开始 由一个函数名和一个该函数的可选参数组成 并且每个参数都可以是一个表达式 表达式以右括号结束 每个表达式都返回一个可由外层表达式使用的值 最后表达式的值返回给调用表达式 AutoLISP程序可以在AutoCAD命令行提示符 VLISP控制窗口的提示符下输入 也可输入到文件中 然后加载 例如 如下代码样例调用了三个函数 fun1 fun2参数 fun3参数 例如 2272 108例如 2 510 30如果输入的闭 右 括号数量不对 AutoLISP将显示如下提示 此提示中开括号的数目表明有多少层开括号没有闭合 如果出现此提示 用户必须输入所需数目的闭括号后才能对表达式求值 2 510 30常见错误是忽略了文本字符串中的双引号 在这种情况下 右括号被解释为字符串的一部分 而不会被用来和开括号配对 要改正此错误 可按SHIFT ESC键取消该函数 然后重新输入正确的表达式 2 1AutoLISP的数据类型整型 INT 实型 REAL 字符型 STR 符号 SYM 表 LIST 内部函数 SUBR 文件描述符 FILE 实体名 ENAME 选择集 PICKSET 函数分页表 PAGETB VLA对象 VisualLispActivex 2 1 1整型整数由数字组成 不包含小数点 AutoLISP的整数是32位带符号的数 取值范围从 2 147 483 647到 2 147 483 648 注意 getint函数只接受16位的数 即 32767到 32678 当用户在AutoLISP表达式中直接使用整数时 该值被称为常量 数字2 56和1 200 196都是有效的AutoLISP整数 如果输入的数超出了允许的最大整数 导致整数溢出 AutoLISP会将整数转换为实数 然而 如果对两个有效整数执行算术运算 其结果超出了允许的最大整数 得出的数是无效的 下面样例说明AutoLISP如何处理整数溢出 最大的正整数保留其值 21474836472147483647如果输入一个大于允许最大值的整数 AutoLISP将其值返回为实数 21474836482 14748e 009 对两个有效整数进行算术运算 但造成了整数溢出 产生无效结果 21474836463 2147483647此样例得出的结果显然是无效的 因为两个正数相加得出了负数 但请注意下列运算如何产生有效的结果 21474836482 2 14748e 009在这个例子中 AutoLISP先将2147483648转换为一个有效的实数 再对其作加法运算 得出的结果是一个有效的实数 最大的负整数值保留其值 有问题 2147483648为最小负数 2147483647 2147483647如果输入一个大于可允许的最大负整数值的负整数 AutoLISP将其值返回为实数 2147483648 2 14748e 009下面样例可以成功算出结果 因为AutoLISP先将溢出的负整数转换为一个有效的实数 21474836481 2 14748e 009 2 1 2实数实数是带有小数点的数 在 1和1之间的实数必须以零开始 实数是以双精度浮点格式存储的 可以提供至少14位精度 注意VisualLISP不显示所有有效位 实数可以用科学记数法表示 科学记数法格式中包括可选的e或E及其后面的指数 例如 0 0000041与4 1e 6相同 数字3 1 0 23 56 123和21 000 000 0都是有效的AutoLISP实数 2 1 3字符串字符串是在双引号中的一组字符 在用引号引起来的字符串中 用反斜杠 字符可以添加控制字符 或换码代码 当用户在AutoLISP表达式中直接使用用引号引起来的字符串时 该值被称为文字字符串或字符串常量 string1 和 nEnterfirstpoint 都是有效的字符串 表示字符 表示字符 r表示回车 n表示换行 nnn表示八进制代码为nnn的ASCII字符字符串常数的最大长度为100 但赋给一个符号的字符串长度没有这个限制 下列都是合法的字符串 nEnterfirstpoint 注意换行的写法 ABC D 注意字符串中含 的写法 c Autocad2000 FONTS TEXT SHX 注意目录的写法 空串2 1 4符号类似其它语言中的变量 但没有固定的数据类型 由赋给它的数据类型决定 符号最大长度为100个字符 AutoLISP通过符号来引用数据 符号名不区分大小写 可以由字母 数字和可打印字符的任何序列组成 但下列字符除外 不能用于符号名的字符 开括号 表的定界符 闭括号 表的定界符 句号 点对标记 单引号 quote函数缩写 双引号 字符串定界符 分号 注释符号空格数据分隔符符号名不能只由数字字符组成 不要求以字母开头 使用系统保留字 如内部函数名 作自定义符号 会改变系统定义 使系统失败 符号也不宜使用 等控制字符 同时VLISP提供了三个预定义变量 PAUSE定义为由一个双反斜杠 字符构成的字符串 此变量与command函数配合使用 用于暂停正在执行的命令 等候用户输入 PI定义为常量 pi 其值近似等于3 14159 T定义为常量T 用作非Nil值 要想指定AutoLISP如何响应修改保护符号的尝试 请从VisualLISP菜单中选择 工具 环境选项 基本选项 2 15原子原子是指不可再分的元素 例如平面内一点的坐标可以分为两个元素 即x坐标值 y坐标值 而x y不可再分 所以称为原子 符号和常数统称为原子 而原子和表统称为表达式 T和nil是两个特殊原子 下面一些字符将终止一个原子或分隔多个原子 开括号 表的定界符 闭括号 表的定界符 单引号 quote函数缩写 双引号 字符串定界符 分号 注释符号空格数据分隔符例如 SETQA ABC 与 SETQA ABC 等价 2 1 6表表是放在一对圆括号中的一个元素或用空格分隔的多个元素 元素可以是原子或表 表的各元素类型可以不相同 这一点不同于其他语言中的一维数组 例如 二维表 20 082 0 三维表 1 02 00 0 函数 12 表有两种基本类型 标准表和引用表 一个引用表在表的前面冠以引用符号 撇号或quote 的表 引用符号告诉AutoLISP对表不求值 如果一个表作为数据处理 而不是作为函数调用 就应作为引用表 对于标准表 表的第一个元素的值必须是一个合法的已经存在的AutoLISP的函数定义 例如 setqa 1 02 00 0 表的顶层是一个标准表 参数是一个引用表 点对是一个特殊的表 有两个元素组成 中间有句号分开 在存储实体图形数据的关联表中使用 例如 8 EWB 空表用 或nil表示 nil即是原子又是表 实体名和选择集等数据类型在以后介绍 2 1 7测试数据类型函数TYPE调用格式为 type数据项 例如 type1 返回INT type abc 返回SYM2 1 8一个AutoLISP程序的例子AutoLISP程序可以在AutoCAD命令行提示符 VLISP控制窗口的提示符下输入 一行输不完 按ctrl Enter键 在下行继续输入 也可输入到文件中 通常扩展名为 LSP 然后通过load函数加载 在屏幕上显示ASCII 30 90 defunc prnas as setqas30 给as赋值为30 while as90 循环 princ chras 显示到屏幕 terpri 换行 setqas 1 as 设as为下一个ASCII值 结束while 假设上面的文件为c test test1 lsp 加载和运行程序如下 加载 load c test test1 扩展名可不写或 load c test test1 运行command prnas或 c prnas 如果上面的LISP程序的第二行为 defunprnas as 则运行程序为command prnas 或 prnas 第三章AutoLISP的基本函数 AutoLISP没有语句的概念 运算符 控制结构和循环结构由函数实现 3 1赋值与求值函数3 1 1赋值函数setqAutoLISP变量的数据类型采用指定给它的值的数据类型 在为变量指定新值前 该变量将一直保留原来的值 可以用AutoLISPsetq函数为变量赋值 setqvariable name1expr1 variable name2expr2 setq函数可以给多个变量赋值 但只返回最后一个表达式的值 如果在VisualLISP控制台提示中使用setq 函数结果将显示在控制台窗口中 setqval3abc3 875 3 875 setqlayr EXTERIOR WALLS EXTERIOR WALLS setqc setqa2b3 3 Setq函数从左到右给变量赋值例如 setqx2 0y4 0pt listxy 2 00004 0000 3 1 2赋值函数set将符号名的值设置成一个表达式的值 setsymexpr set函数与setq类似 但set计算两个参数的值 而setq只计算第二个参数的值 setqd c C setd2 2 c2 注意 使用set函数时 符号的值不为符号出错 setqdnil nil setd2 错误 参数类型错误 symbolpnil 3 1 3禁止求值函数quote等同于单引号 调用格式为 quoteexpr 例如 quote 65 等同 65 注意求值与不求值的区别例如 setqa 65 65 setqa 65 11 该函数在引用表中经常用到 例如 setqpt 1 01 01 0 正确 setqpt 1 0 1 0 1 0 错误 3 1 4再求值函数eval求表达式值的值 也就是说求两次值 evalepxr 例如 setqa 56 56 evala 30 setqa b B setqb c C evala C eval a quote只能阻止一次求值B eval5 对数求值结果为其自身5 eval 34 对字符串求值结果为其自身 34 例 看两个例子的区别 setqadd add12 3 setqadd evaladd 12 3 3 2数值函数包含基本算术函数 三角函数以及位操作布尔函数 大部分函数返回值是整数还是实数遵循下列规则 若参数表中的所有参数都为整型 则AutoLISP求值器对表作整数运算 返回整数值 若参数表中有一个参数为实型 则AutoLISP求值器对表作浮点运算 返回实型值 若参数多于两个 从左到右计算 数学函数函数说明 numbernumber 返回所有数值的总和 numbernumber 从第一个数值中减去第二个和后面的数值 返回差值 numbernumber 返回所有数值的乘积 numbernumber 用第一个数值除以后面其他数值的乘积 返回商值 int 返回参数的按位非 即1的补码为0 1 number 返回参数加1后的结果 1 number 返回参数减1后的结果 absnumber 返回参数的绝对值 atannum1 num2 返回一个数的反正切值 以弧度为单位 cosang 返回一个以弧度表示角度的余弦值 expnumber 返回常数e 实数2 718282 的指定次幂的值 exptbasepower 返回一个数的指定次幂的值 fixnumber 截去实数的小数部分 将它转换成整数后返回该整数 floatnumber 将一个数转换成实数后返回该实数 gcdint1int2 返回两个整数的最大公约数 lognumber 以实数形式返回一个数的自然对数 logand intint 返回一组整数逻辑按位与 AND 的结果 logior intint 返回一组整数逻辑按位或 OR 的结果 lsh intnumbits 返回一个整数进行指定位逻辑移位后的结果 max numbernumber 返回给定的数中的最大值 min numbernumber 返回给定的数中的最小值 minuspnumber 检查一个数是否是负数 rem num1num2 用第一个数除以第二个数 返回余数 sinang 以实数形式返回一个以弧度表示的角度的正弦值 sqrtnumber 以实数形式返回一个数的平方根 zeropnumber 检查一个数的值是否为0 3 2 1算术运算函数函数 123 含义1 2 36 512 含义5 1 22 5 注意 当减法函数只有一个参数时 给数取相反数 5 234 0 含义2 3 4 024 0 232 0 含义2 3 2 00 333333 注意其它高级语言的0 0 加1减1函数1 1 常用在循环中 注意 加减号与1之间无空格 1 n 等同 1n 1 n 等同 n1 求余数 rem num1num2 若参数多于两个时 前面两个数相除取余数在与后面的数相除取余数 rem 注意 无参数0 rem415 4 等同 rem rem415 4 1 rem rem415 4 1若余数非零 则符号与数num1的符号相同 rem 64 2 rem6 4 2最大值和最小值 max numbernumber 返回给定的数中的最大值 min numbernumber 返回给定的数中的最小值 max1 02 2 0最大值是2 但函数返回实数2 0 gcdint1int2 返回两个整数的最大公约数 expnumber 返回常数e 实数2 718282 的指定次幂的值 exptbasepower 返回一个数的指定次幂的值 lognumber 以实数形式返回一个数的自然对数 sqrtnumber 以实数形式返回一个数的平方根 absnumber 返回参数的绝对值3 2 2三角函数参数可以是实型或整型 但返回值总为实型 角度以弧度表示 cosang 返回一个以弧度表示的角度的余弦值 sinang 以实数形式返回一个以弧度表示的角度的正弦值 atannum1 num2 返回一个数的反正切值 以弧度为单位 如果仅提供一个参数num1 本函数返回数num1的以弧度为单位的反正切值 如果提供了两个参数num1和num2 本函数返回num1 num2的以弧度为单位的反正切值 如果num2为0 该函数返回正的或负的1 570796弧度 90度或 90度 其正负取决于num1的正负 该函数返回的角度的范围是 pi 2至 pi 2 弧度 atan1 0 785398 atan23 0 0 588003 3 2 3数的类型转换函数 fixnumber 截去实数的小数部分 取整 参数整实皆可 floatnumber 将一个数转换成实数 参数整实皆可 float1 1 0 float1 0 1 0 fix1 6 注意不是四舍五入13 2 4整数操作布尔函数 位操作在CAD中经常用到 例如系统变量OSMODE存储目标捕捉模式1 终点 2 中点 4 圆心 8 节点 测试节点捕捉模式是否被设置 setqa getvar OSMODE IF LOGANDA8 8 PRINC n节点捕捉模式被设置 PRINC n节点捕捉模式未被设置 3 3表处理函数表处理函数是其它语言中名有的 其中有些函数可以处理点对 但大部分函数只能处理一般的表 carlst 返回表的第一个元素 car xyz X car ab c d5 AB C car 0 LINE 0 car nil cdrlst cdr xyz YZ cdr 0 LINE LINE cdr 0 LINE LINE CAR和CDR的组合函数CAR和CDR可任意组合 深度最多为四级 组合形式为CXR CXXR CXXXR CXXXXR 其中X为A或D A表示CAR D表示CDR 例如CAAR CADR CADADR 注意 作用顺序为从右到左 cadr xyz 等同 car cdr xyz Y caddr xyz Z lastlst 返回表的最后一个元素 若LST为nil 返回nil last abc C last 2 只有一个元素2 lastnil nil nthnlst 返回表的第n个元素 从零排序 其中n 0 若n大于表的最大元素号 返回nil nth2 a ab cd e CD nth5 xy nil3 3 2表的构造与修改函数 consnew first elementlst cons x abc XABC cons x a X A cons anil A setqx1y2 2 consxy 1 2 list expr 将任意数目的表达式合成一个表 list 56 c d 11CD list a bc d A BC D list nil appendlst 将任意数目的表合成一个表 append ab cd ABCD setqx abc y def DEF appendxy ABCDEF substnewitemolditemlst 把lst中顶层元素中所有与olditem的值相等的元素用元素newitem 然后返回修改后的表的副本 subst x y y xy y X XY X reverselst 颠倒表中元素的顺序 然后返回修改后的表 reverse a bcd f F BCD A 3 3 3联结表联结表联结表又称A表 它是以点对或子表为元素的表 点对的左元素和子表的第一个元素称为联结表的关键字 CAD实体的图形数据用联结表的形式存储 例如一条线段数据的定义 1 0 LINE 330 5 2B 100 AcDbEntity 67 0 410 Model 8 0 100 AcDbLine 10145 961183 2490 0 11185 795113 7510 0 2100 00 01 0 联结表的检索 associtemalist 返回联结表alist的顶层元素中第一个含关键词item的元素 若找不到 返回nil assoc A 1 B A C A D A C 联结表的修改联结表的修改常常只改变与关键词相关的值 主要利用SUBST CONS CAR CDR ASSOC函数 用dada替换联结表alist中与关键词key相关的值 若不存在 返回nil defunacons keydataalist if assockeyalist subst conskeydata assockeyalist alist nil 或 defunacons keydataalist tam if setqtam assockeyalist subst conskeydata tamalist nil 取值 cdr assockeyalist 3 3 4 lengthlst 以整数形式返回表中元素的数目 length abc 3 lengthnil 0 acad strlsortlst 按字母顺序对字符串表进行排序 appendlst 将任意数目的表合成一个表 associtemalist 从关联表中搜索一个元素 如果找到则返回该关联表条目 carlst 返回表的第一个元素 cdrlst 返回指定的表 表的第一个元素除外 consnew first elementlst 基本的表构造函数 foreachnamelst expr 将表的所有成员带入表达式求值 lastlst 返回表的最后一个元素 lengthlst 以整数形式返回表中元素的数目 list expr 将任意数目的表达式合成一个表 listpitem 检查某个项目是否是表 mapcarfunctionlist1 listn 将一个或多个表的各个元素作为函数的参数 返回该函数执行结果的表 memberexprlst 在表中搜索指定的表达式 并从第一次出现该表达式的位置开始返回表的其余部分 nthnlst 返回表的第n个元素 reverselst 颠倒表中元素的顺序 然后返回修改后的表 substnewitemolditemlst 在表中搜索某个旧项目 并用一个新项目替换表中的所有旧项目 然后返回修改后的表的副本 第四章函数的定义 4 1DEFUN定义有名函数 defunsym arguments variables expr 参数sym 函数名arguments 函数需要的形式参数名 variables 函数使用的一个或多个局部变量名 局部变量名称前的斜线和第一个局部名称之间 以及该斜线和最后一个参数 如果存在的话 之间 都必须保持至少一个空格的距离 expr 执行函数时要执行的任意数目AutoLISP表达式 如果没有声明任何参数或局部符号 则在函数名称后必须使用空括号 如果指定了重复的参数或符号名称 AutoLISP使用第一个出现的名称 而忽略其他的名称 返回值最后计算的表达式的值 警告 不要将内置函数或符号作为sym的值 这样会覆盖原有的定义 导致内置函数或符号无法使用 要获得内置函数和预定义函数的列表 请使用atoms family函数 函数自己调用自己形成递归调用 把一个表的元素相加 defunadd lst iflst carlst add cdrlst 0 注意 函数add返回值类型不唯一 与表的元素类型相关 add 123 6 add 123 0 6 0 4 2函数中的局部变量和全局变量函数调用是值传递 选择集除外 即形参也是局部变量 对一个函数讲 出现在函数体中除形参和局部变量之外的变量为全局变量 也称自由变量 局部变量和全局变量的生命周期与与其它高级语言相同 注意 全局变量的类型可以变化 例题 defunvartest xy setqx 1 x y y2 0 setqz xy setqx10y20z30 30 vartest4 03 5 1 12 0 x10 y20 z12 0 注意 无定义的局部变量和全局变量其值为nil 不是零 4 3defun函数与AutoCAD前面版本的兼容性Defun函数已经在AutoCAD2000内部作了改变 Defun q函数严格地与前面的版本兼容例如 defunfoo x 1 x FOO appendfoo 34 错误 无法访问编译的函数定义 可能需要用defun q进行定义 defun qfoo1 x 1 x FOO1 appendfoo1 34 X 1 X 34 typefoo USUBR typefoo1 LIST 4 4c xxx函数以c xxx命名格式定义的函数不允许有形参 当函数体内不调用command函数时 可作为透明命令使用 用C XXX命名格式可以给AutoCAD增加新的命令或重新定义已存在的命令 例题 defunc hello princ nHELLO princ 4 5修改AutoCAD命令分两步用AutoCAD的UNDEFINE命令取消AutoCAD命令 例如 command undefinecommandname linecommand line命令被取消 如果line没有新定义 那么在输入line命令将出错 但是只要在该命令前加句号 不管命令被取消与否或重新定义 就可以执行该内部命令 例如command line 当AutoCAD命令被取消后 用C XXX形函数对AutoCAD命令重新定义 例题 command undefine line defunC line s initget1 LinePline setqs getkword nLine Pline if s Line command line command pline 注意 被undifine取消的命令可以用redefine命令恢复 4 6函数调用参数类型的检查在AutoCAD2000中 AutoLISP会在检查参数类型之前计算所有参数 而在AutoCAD前面的版本中 AutoLISP是顺序计算所有参数 并检查它们的类型 例如在AutoCAD2000中 1 ABC princ nHELLO HELLO 错误 参数类型错误 numberp ABC 在AutoCAD14中 1 ABC princ nHELLO 错误 参数类型错误 numberp ABC 第五章控制结构 控制结构由函数实现 5 1谓词函数谓词函数是用于测试其参数是否具有某种性质或关系的函数 其值为T 代表真 或nil 代表假 5 1 1数的谓词函数1 数的性质谓词函数 minuspnumber 检查一个数是否是负数 zeropnumber 检查一个数的值是否为0 numberpitem 检查某个项是否是实数或整数例如 zerop0 T zerop1 1 nil 2 数的比较为此函数 numstr numstr 如果所有参数的数值相等则返回T 否则返回nil numstr numstr 如果各参数的数值不相等则返回T 否则返回nil numstr numstr 如果每个参数的数值都大于它右边的参数则返回T 否则返回nil numstr numstr 如果每个参数的数值都大于或等于它右边的参数则返回T 否则返回nil当只有一个参数时 返回T 注意 不仅可以比较数 还可以比较字符串 同时可以比较多个数据 例如 carnumstr maxnumstr cdrnumstr 递归调用 carnumstr maxnumstr cdrnumstr nil 调用 maxnumstr 132 3 maxnumstr asd dfd hgrt hgrt 5 1 2数据类型谓词函数 typeitem 参数item符号 返回值item的数据类型 如果项的值等于nil 如未指定的符号 则返回nil 返回的数据类型是下表所列的几种原子之一 type函数返回的数据类型数据类型说明ENAME图元名EXRXSUBR外部ObjectARX应用程序FILE文件描述符INT整数LIST表PAGETB函数分页表PICKSET选择集REAL浮点数SAFEARRAYSafearraySTR字符串SUBR内部AutoLISP函数或由编译 FAS或VLX 文件加载的函数从AutoCAD命令提示中加载的LISP源文件函数也可能作为SUBR出现 SYM符号VARIANT变体USUBR从LISP中加载的用户定义函数VLA objectActiveX对象 例如 假设对变量进行如下赋值 setqa123r3 45s Hello x abc setqf open name r 然后 type a 返回SYM typea 返回INT typef 返回FILE typer 返回REAL types 返回STR typex 返回LIST type 返回SUBR typenil 返回nil 2 atomitem 验证一个项是否是原子item任意AutoLISP项如果item是表 则为nil 否则为T 任何不是表的变量都认为是元素原子 某些版本的LISP对atom 原子 的解释有些不同 所以在使用移植的代码时应加以注意 例题 setqa xyz b a A atom a T atoma nil atom b T atomb T atomnil T 3 listpitem Item是表 返回T 否则返回nil例题 listp 12 T listp 12 nil 4 nullitem Item的值是nil返回T 否则返回nil例题 setqa1bnil nil nulla nil nullb T 5 boundpsym 检验符号是否被设置为某个值如果参数sym已被设置为非nil值 该函数返回T 如果sym没有设置或它被设置为nil 本函数返回nil 如果sym是一个未定义的符号 则自动创建它 并将其设为nil 样例命令 setqa2bnil nil命令 boundp a T命令 boundp b nil注意本函数与null函数的区别 6 T与nil的区别 type t SYM typet SYM atomt T listpt nil boundpt T T是符号 其值为真 type nil nil typenil nil atomnil T listpnil T boundpnil nil nil表示无值 是原子 又是表 5 1 3等值谓词函数 numstr numstr 如果所有参数的数值相等则返回T 否则返回nil eqexpr1expr2 确定表达式expr1和expr2是否设置为同一对象 equalexpr1expr2 fuzz 判断两个表达式的值是否相等 fuzz为实数 定义expr1和expr2之间的最大允许误差 误差在此范围内时 仍然认为二者相等 比较eq和equal函数可以得到下列结论两个表的equal相等 对eq不一定相等 当误差为零时 原子的equal相等 则eq一定相等 两个原子或表eq相等 则一定equal相等 例题 setqa xyz b xyz ca XYZ eqab nil eqac T eq1 setqa1 T equal log exp5 exp log5 nil equal log exp5 exp log5 0 001 T equal 123 0 991 992 99 0 011 T 5 1 4逻辑谓词函数 and expr 返回一组表达式的逻辑与 AND or expr 返回一组表达式的逻辑或 OR notitem 逻辑非 与null函数等价 5 1 5判断从属关系的谓词函数 memberexprlst 搜索表中是否包含某表达式 并从该表达式的第一次出现处返回表的其余部分 如果lst中不包含expr 则返回nil 例题 member c abcde CDE member q abcde nil 5 2条件分支函数分支和循环函数的条件非nil即为真 5 2 1多条件 多处理结果函数 cond test result cond函数的参数可以为任意数目的表 它按顺序对每一个表的第一项求值 直到其中之一的返回值不是nil为止 该函数接着对该项后续的其他表达式求值 返回值结果表达式中最后一个表达式的值 如果子表中只有一个表达式 即result不存在 则返回test的值 如果未指定参数 cond返回nil 下面的样例使用cond函数执行求绝对值计算 cond minuspa a ta cond可以作为case类型的函数使用 一般情况下 使用T作为最后一个 缺省 test表达式 在下面的另一个简单样例中 变量s中存储的是用户输入的字符串 该函数将测试该字符串 如果s是Y或y则返回1 如果s是N或n则返回0 否则返回nil cond s Y 1 s y 1 s N 0 s n 0 tnil cond 返回nil 当x为大于0的整数时 返回其平方根 当x为其他数值时 打印其平方值 当x不为数时 则打印错误提示 cond and equal typex INT x0 sqrtx numberpx princ n princ list exptx2 princ princ exptx2 t princ nxisnotanumber 5 2 2IF条件函数 iftestexprthenexpr elseexpr if函数返回选定表达式的值 如果未指定elseexpr且testexpr为nil 则if返回nil 样例 if 13 YES no no if 2 11 YES YES if 2 34 YES nilIF函数等效于 cond testexprthenexpr telseexpr 注意if中的thenexpr和elseexpr要求一个表达式 这和cond不同 cond x0 setqx x2 0 setqy x4 0 y x3 0 if x0 0 progn setqx x2 0 setqy x4 0 y x3 0 5 3循环函数while repeat foreach mapcar5 3 1 whiletestexpr expr 对测试表达式进行求值 如果它不是nil 则执行循环体中的表达式 重复这个过程 直到测试表达式的求值结果为nil 返回最后的expr表达式最新的值或nil 第一次求值testexpr为nil 返回nil 在屏幕上打印整数1 10的平方 setqn1 while n10 princ strcat n itoan x itoan itoa nn setqn 1 n 打印结果1x1 12x2 43x3 94x4 165x5 256x6 367x7 498x8 649x9 8110 x10 100 5 3 2 repeatint expr 对循环体中的每一个表达式进行指定次数的求值计算 并返回最后一个表达式的值 int为整数 如果未提供expr参数或int小于等于0 repeat返回nil 样例 setqa10b100 repeat4 setqa a10 setqb b100 返回5005 3 3 foreachnamelist expr foreach函数遍历表 将其中每一个元素依次赋给变量 并对每一个表达式求值 可以指定任意多个表达式 参数name表中元素将被赋给该名称指定的变量 list由要求值的元素组成的表 expr要对list中元素求值的表达式 返回值最后一次计算expr的结果 如果未指定expr foreach返回nil setqa1b2c3 3 foreachn abc printn ABCC foreachn listabc printn 1233 foreach等效于 setqi0 while setqname thnilist setqi 1 i expr 5 3 4 mapcarfunctionlist1 listn 将作为本函数参数的一个或多个表的各个元素提供给指定函数进行求值 并将由求值结果构成的表返回参数function函数 list1 listn一个或多个表 表的数目必须与function参数中要求的参数个数相等 返回值表 mapcar 123 456 579 mapcar 1 123 234 mapcar cons xy 12 X 1 Y 2 注意 的个数和其元素的类型应与函数的参数一致 mapcar函数和foreach函数一样 它不对表中的参数求值 例题 setqa2b2 2 mapcar ab 12 错误 参数类型错误 numberp A上式等效于 list a 1 b 2 错误 参数类型错误 numberp A正确的表达式 mapcar listab 12 34 setqfun mapcarfun listab 12 34 5 4调用函数的函数 apply functionlist 将参数表list传给指定的函数function参数 function函数 可以是表示defun或lambda表达式的符号 list表 如果函数不接收参数 则该参数为nil 返回值函数调用的结果 样例 APPLY 123 6利用apply函数可以使一些不能直接对表操作的函数对表操作成为可能 setql 247 247 maxl 错误 参数类型错误 numberp 247 apply maxl 7 eval cons maxl 7 apply setq a1 错误 SETQ中变量名称错误 QUOTEA apply set a1 1 5 5定义无名函数 lambdaargumentsexpr 在经常使用某一表达式 而又觉得把它定义成一个新函数开销太大时可使用lambda函数 lambda将定义的函数放在要使用它的位置 还可以使程序员的意图表达得更清楚 lambda函数返回它最后一个expr的值 它常与apply和 或 mapcar函数连用 以便对表中的元素执行某个操作 下面的样例说明如何从VisualLISP控制台窗口调用lambda函数 apply lambda xyz x yz 52014 30 setqcounter0 mapcar lambda x setqcounter 1 counter x5 24 610 2 0 1020 3051 0 5 6顺序控制函数 progn expr 顺序地对每一个表达式进行求值 并返回最后那个表达式的值在仅能使用一个表达式充当操作数 却需要对好几个表达式求值的地方 使用progn函数 样例通常情况下 if函数在测试结果不为nil的情况下 仅对一个then表达式进行求值 在本例中由于使用了progn函数 可以实现对两个表达式的求值 if ab progn princ nA B setqa a10 b b10 5 7综合应用定义一个集合操作函数 取两个集合 表 的交集 defuniunion l1l2 la if andl1l2 progn while setqa carl1 setql1 cdrl1 if and not memberal1 memberal2 setql consal l iunion aba adb AB 判断一个正整数是否是素数 标志变量 w 0 素数 w 1 非素数 defunex51 n rwi setqw0i2 while andi i n1 setqr remni if r0 setqw1inil setqi 1 i if w0 princ strcat n itoan 是素数 princ strcat n itoan 不是素数 princ IMPLICITNONEINTEGERN R W IREAD NW 0DOI 2 N 1R MOD N I IF R 0 THENW 1EXITENDIFENDDOIF W 0 THENPRINT N 是素数 ELSEPRINT N 不是素数 ENDIFEND 用牛顿法求F x x3 2x2 4x 1 0在x 0附近的一个实根F x 3x2 4x 4 defunex52 nx1xf1f setqx0 0n1 while or n1 abs xx1 1 0e 6 setqx1x setqf exptx13 2 0 x1x1 4 0 x1 1 0 setqf1 3 0 x1x1 4 0 x1 4 0 setqx x1 ff1 print listnx1x setqn 1 n princ implicitnonereal x1 x f1 fintegernread xn 1dowhile n 1 or abs x x1 1 0e 6 dowhile n 1 or x 0 and abs x x1 1 0e 6 or x 0 and abs x x1 x 1 0e 6 x1 xf x1 3 2 0 x1 2 4 0 x1 1 0f1 3 0 x1 2 4 0 x1 4 0 x x1 f f1n n 1print n x1 xenddoend 用梯形法求函数f x x2 12x 4在区间 1 4 上的定积分implicitnonerealx a b h f0 f1 s tintegern iread n a bs 0 0 x af0 x x 12 0 x 4 0h b a ndoi 1 nx x hf1 x x 12 0 x 4 0t f0 f1 h 2s s tf0 f1enddoprint s send defunex53 nab hf0f1stemp setqa floata b floatb setqs0 0 setqxa setqf0 xx 12 0 x 4 0 setqh ba n repeatn setqx xh f1 xx 12 0 x 4 0 temp f0f1 h0 5 s stemp f0f1 princ ns princs princ 有一分数序列2 1 3 2 5 3 13 8 求其前20项的和 数列的特点 后一项分母等于前一项的分子 后一项分子分母等于前一项的分子 分母之和 defunex54 n abstemp setqa2 0b1 0s ab repeat n1 setqtempaa ab btemps s ab princ ns princs princ implicitnonereala b s tintegern iprint n read na 2 0b 1 0s a bdoi 2 nt aa a bb ts s a benddoprint s send 求100 200之间的全部素数implicitnoneintegeri j kdoi 100 200doj 2 i 1if mod i j 0 exitenddoif j i thenprint i 是素数 endifenddoend defunex55 ab ij setqia while ib setqj2 while j i1 if remij 0 setqji setqj 1 j if ji princ strcat n itoai 是素数 setqi 1 i princ 删除表的i号元素 defunlistdel lsti ac cond i0 cdrlst i 1 lengthlst reverse cdr reverselst t repeati setqa carlst lst cdrlst c consac append reversec cdrlst 插入i号元素val defunlistins lstival ac cond i0 consvallst t repeati setqa carlst l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论