acy2000 发表于 2008-4-22 20:13:00

AutoLISP的EVAL函数用法浅议

<p><font size="4"><font size="3">以下为本人文章,发表于哈尔滨工程高等专科学校学报上,希望能起到对大家抛砖引玉的作用。申请加精。</font></font></p><p><font size="4"><font size="3">AutoLISP的EVAL函数用法浅议 </font><p class="txt14"><strong>摘要 AutoLISP是AUTOCAD中最常用、最有效的开发工具。其中Eval函数具有特殊的功能,在应用系统中使用EvaI可以实现用变量来代表函数调用表达式,进行较复杂的程序运行控制。 </strong></p><p class="txt14"><strong>关键词 AutoLISP Eval </strong></p><p class="txt14"><strong>中图分类号 TP 312Au </strong></p><p class="txt14"><strong>Autodesk公司的AUTOCAD功能强大,其嵌套的AutoLISP是提供给用户应用开发手段中最常用、最有实效的一种,成为广大AutoCAD用户的得力助手。其函数的灵活性和易掌握性也得到了人们的认可。笔者就(Eval)函数浅议其功能和应用方法。 </strong></p><p class="txt14"><strong>1 (Eval)函数的语法规则 </strong></p><p class="txt14"><strong>格式:(Eval表达式) </strong></p><p class="txt14"><strong>说明:表达式可以是任何的Autolisp表达式 </strong></p><p class="txt14"><strong>返回:返回表达式,能运算的返回其结果;不能运算的返回其本身 </strong></p><p class="txt14"><strong>2 (Eval)函数的典型用法 </strong></p><p class="txt14"><strong>1)可以形成自定义函数的返回值 </strong></p><p class="txt14"><strong>将(Eval)函数放于函数最后一个表达式位置。具体例子如例1,当然用例2方法也可以作到。 </strong></p><p class="txt14"><strong>(defun aa() (defun aa() </strong></p><p class="txt14"><strong>… … </strong></p><p class="txt14"><strong>(setq b …) (setq b …) </strong></p><p class="txt14"><strong>… … </strong></p><p class="txt14"><strong>(eval b) (eval b) </strong></p><p class="txt14"><strong>) ) </strong></p><p class="txt14"><strong>例1 例2 </strong></p><p class="txt14"><strong>2)有效地简化程序控制描述。这是其它函数很难做到的,因为(Eval)函数可以顺利实现“用变量来代表函数调用表达式,进行较复杂的程序运行控制”的设想,顺此思路,再深一层思考就可以用其它表达式生成用变量表示的函数调用表达式,用0(Eval)处理这个变量后也即用了此函数。我们由此也可分析得出函数调用表达式这种表也是AutoLISP的一种数据类型,当然(type)函数符号类型中,表和用户类型函数是作为同一个类型(list)体现的。 </strong></p><p class="txt14"><strong>我们的思路过程为: </strong></p><p class="txt14"><strong>由“表达式”转化为“变量”转化为“函数调用” </strong></p><p class="txt14"><strong>3 实例 </strong></p><p class="txt14"><strong>在运用调用调试1isp程序时,经常要进行以下操作 </strong></p><p class="txt14"><strong>edit↙(回车) </strong></p><p class="txt14"><strong>xxx.lsp↙ </strong></p><p class="txt14"><strong>(load “xxx”) ↙ </strong></p><p class="txt14"><strong>xxx↙ (注:文件名与程序主函数名一致) </strong></p><p class="txt14"><strong>笔者利用(Eval)函数,在菜单文件上加入相应命令,只需点取屏幕菜单即可完成编辑程序、运行程序,大大提高了效率,而其它函数在此很难做到。 </strong></p><p class="txt14"><strong>调试程序为 timer.lsp (defun c:timer()). </strong></p><p class="txt14"><strong>当前磁盘上存有的文件仅一行:(defun C:timer( ))。调入一个名为Edlsp.mnu的菜单(例3),再利用AutoCAD系统提供的字符型系统变量users1,就可以方便地选取菜单完成程序编辑、调试和运行的操作。 </strong></p><p class="txt14"><strong>1)对users1赋值 </strong></p><p class="txt14"><strong>Command:(setvar“users1” “timer”) </strong></p><p class="txt14"><strong>2)选菜单完成timer.lsp程序的调试与运行。 </strong></p><p class="txt14"><strong>…… </strong></p><p class="txt14"><strong>[程序调试] </strong></p><p class="txt14"><strong>[编辑 lisp]^c^c^Pedit;(strcat (getvar "usersl”) “.lsp”) </strong></p><p class="txt14"><strong>[运行 lisp]^c^c^P(load (getvar ”users1”));(eval (read (strcat “(” (getvar “users1”+ </strong></p><p class="txt14"><strong>) +“)”))) </strong></p><p class="txt14"><strong>…… </strong></p><p class="txt14"><strong>例3 Edlsp.mnu </strong></p><p class="txt14"><strong>当选择[编辑lisp]菜单项时,系统根据Acad.pgp自动进入Edit,并调入(strcat (getvar “users1”)“.lsp”)返回的lisp程序timer.lsp,供作者编写、修改,编辑完程序后,存盘退出edit,系统自动返回AutoCAD图形界面。再选取[运行1isp]菜单项,该菜单先执行(getvar “usersl”),得到字符串“timer”,再执行(load “timer”),把timer.lsp调入内存。然后执行该项的后半部分(strcat “(” “timer” “)”)返回字符串“(timer)”。经过read函数处理得到去除括号后的程序名timer,最后执行(eval timer),即运行timer程序,进行程序调试。 </strong></p><p class="txt14"><strong>如果要调试其它程序,只要对系统变量users1赋以其它程序名,再执行菜单edlsp的 “编辑 lisp” “运行 lisp” 即可。 </strong></p><p class="txt14"><strong>事实上,(evaI)函数更多地被利用于大程序的分支结构中。例如在绘制地形图中的各种符号的十多个程序,程序名为SYX,其中X为符号的代码,那么用下列程序行即可完成选绘符号的操作。 </strong></p><p class="txt14"><strong>(setq N (getstring “请输入符号代码:”)) </strong></p><p class="txt14"><strong>(laod (strcat “sy” N)) </strong></p><p class="txt14"><strong>(eval (read (strcat “(“ “sy” N “)”))) </strong></p><p class="txt14"><strong>若没有(EvaI)函数,上述过程要用十几行才能完成。 </strong></p><p class="txt14"></p><p class="txt14"><strong>参 考 文 献 </strong></p><p class="txt14"><strong>1.霍新民,王国泉,汪琪美. AutoLISP(2.62版)程序设计与应用.北京:中国科学院希望高级电脑技术出版社,1989 </strong></p><p class="txt14"><strong>2.甘特等.AutoLISP 12.0程序设计.北京:学苑出版社,1993 </strong></p><p class="txt14"><strong><br/></strong></p></font></p><p class="txt14"><strong>摘要 AutoLISP是AUTOCAD中最常用、最有效的开发工具。其中Eval函数具有特殊的功能,在应用系统中使用EvaI可以实现用变量来代表函数调用表达式,进行较复杂的程序运行控制。 </strong></p><p class="txt14"><strong>关键词 AutoLISP Eval </strong></p><p class="txt14"><strong>中图分类号 TP 312Au </strong></p><p class="txt14"><strong>Autodesk公司的AUTOCAD功能强大,其嵌套的AutoLISP是提供给用户应用开发手段中最常用、最有实效的一种,成为广大AutoCAD用户的得力助手。其函数的灵活性和易掌握性也得到了人们的认可。笔者就(Eval)函数浅议其功能和应用方法。 </strong></p><p class="txt14"><strong>1 (Eval)函数的语法规则 </strong></p><p class="txt14"><strong>格式:(Eval表达式) </strong></p><p class="txt14"><strong>说明:表达式可以是任何的Autolisp表达式 </strong></p><p class="txt14"><strong>返回:返回表达式,能运算的返回其结果;不能运算的返回其本身 </strong></p><p class="txt14"><strong>2 (Eval)函数的典型用法 </strong></p><p class="txt14"><strong>1)可以形成自定义函数的返回值 </strong></p><p class="txt14"><strong>将(Eval)函数放于函数最后一个表达式位置。具体例子如例1,当然用例2方法也可以作到。 </strong></p><p class="txt14"><strong>(defun aa() (defun aa() </strong></p><p class="txt14"><strong>… … </strong></p><p class="txt14"><strong>(setq b …) (setq b …) </strong></p><p class="txt14"><strong>… … </strong></p><p class="txt14"><strong>(eval b) (eval b) </strong></p><p class="txt14"><strong>) ) </strong></p><p class="txt14"><strong>例1 例2 </strong></p><p class="txt14"><strong>2)有效地简化程序控制描述。这是其它函数很难做到的,因为(Eval)函数可以顺利实现“用变量来代表函数调用表达式,进行较复杂的程序运行控制”的设想,顺此思路,再深一层思考就可以用其它表达式生成用变量表示的函数调用表达式,用0(Eval)处理这个变量后也即用了此函数。我们由此也可分析得出函数调用表达式这种表也是AutoLISP的一种数据类型,当然(type)函数符号类型中,表和用户类型函数是作为同一个类型(list)体现的。 </strong></p><p class="txt14"><strong>我们的思路过程为: </strong></p><p class="txt14"><strong>由“表达式”转化为“变量”转化为“函数调用” </strong></p><p class="txt14"><strong>3 实例 </strong></p><p class="txt14"><strong>在运用调用调试1isp程序时,经常要进行以下操作 </strong></p><p class="txt14"><strong>edit↙(回车) </strong></p><p class="txt14"><strong>xxx.lsp↙ </strong></p><p class="txt14"><strong>(load “xxx”) ↙ </strong></p><p class="txt14"><strong>xxx↙ (注:文件名与程序主函数名一致) </strong></p><p class="txt14"><strong>笔者利用(Eval)函数,在菜单文件上加入相应命令,只需点取屏幕菜单即可完成编辑程序、运行程序,大大提高了效率,而其它函数在此很难做到。 </strong></p><p class="txt14"><strong>调试程序为 timer.lsp (defun c:timer()). </strong></p><p class="txt14"><strong>当前磁盘上存有的文件仅一行:(defun C:timer( ))。调入一个名为Edlsp.mnu的菜单(例3),再利用AutoCAD系统提供的字符型系统变量users1,就可以方便地选取菜单完成程序编辑、调试和运行的操作。 </strong></p><p class="txt14"><strong>1)对users1赋值 </strong></p><p class="txt14"><strong>Command:(setvar“users1” “timer”) </strong></p><p class="txt14"><strong>2)选菜单完成timer.lsp程序的调试与运行。 </strong></p><p class="txt14"><strong>…… </strong></p><p class="txt14"><strong>[程序调试] </strong></p><p class="txt14"><strong>[编辑 lisp]^c^c^Pedit;(strcat (getvar "usersl”) “.lsp”) </strong></p><p class="txt14"><strong>[运行 lisp]^c^c^P(load (getvar ”users1”));(eval (read (strcat “(” (getvar “users1”+ </strong></p><p class="txt14"><strong>) +“)”))) </strong></p><p class="txt14"><strong>…… </strong></p><p class="txt14"><strong>例3 Edlsp.mnu </strong></p><p class="txt14"><strong>当选择[编辑lisp]菜单项时,系统根据Acad.pgp自动进入Edit,并调入(strcat (getvar “users1”)“.lsp”)返回的lisp程序timer.lsp,供作者编写、修改,编辑完程序后,存盘退出edit,系统自动返回AutoCAD图形界面。再选取[运行1isp]菜单项,该菜单先执行(getvar “usersl”),得到字符串“timer”,再执行(load “timer”),把timer.lsp调入内存。然后执行该项的后半部分(strcat “(” “timer” “)”)返回字符串“(timer)”。经过read函数处理得到去除括号后的程序名timer,最后执行(eval timer),即运行timer程序,进行程序调试。 </strong></p><p class="txt14"><strong>如果要调试其它程序,只要对系统变量users1赋以其它程序名,再执行菜单edlsp的 “编辑 lisp” “运行 lisp” 即可。 </strong></p><p class="txt14"><strong>事实上,(evaI)函数更多地被利用于大程序的分支结构中。例如在绘制地形图中的各种符号的十多个程序,程序名为SYX,其中X为符号的代码,那么用下列程序行即可完成选绘符号的操作。 </strong></p><p class="txt14"><strong>(setq N (getstring “请输入符号代码:”)) </strong></p><p class="txt14"><strong>(laod (strcat “sy” N)) </strong></p><p class="txt14"><strong>(eval (read (strcat “(“ “sy” N “)”))) </strong></p><p class="txt14"><strong>若没有(EvaI)函数,上述过程要用十几行才能完成。 </strong></p><p class="txt14"></p><p class="txt14"><strong>参 考 文 献 </strong></p><p class="txt14"><strong>1.霍新民,王国泉,汪琪美. AutoLISP(2.62版)程序设计与应用.北京:中国科学院希望高级电脑技术出版社,1989 </strong></p><p class="txt14"><strong>2.甘特等.AutoLISP 12.0程序设计.北京:学苑出版社,1993 </strong></p><p class="txt14"><strong><br/></strong></p>

无痕 发表于 2008-5-2 22:47:00

好像对eval的本质没展开论述,缺一点深度

我爱lisp 发表于 2017-8-4 16:07:37

有点深了,最好浅显一点方便大家理解

434939575 发表于 2021-5-14 12:09:34

听说这个好,不会运用。学习了.
页: [1]
查看完整版本: AutoLISP的EVAL函数用法浅议