查看单个帖子
旧 2009-04-29, 05:01 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】[翻译] metaprogramming with autocad (一) - 精华帖集合

[翻译] metaprogramming with autocad (一) - 精华帖集合
www.dimcax.com
[翻译] metaprogramming with autocad (一)
metaprograming(元编程)是一种可以写或者操作其他程序(或者它自身)的编程技术-来源自wikipedia的定义。但是它究竟是什么呢? 为了帮助理解metaprograming,我们将视线放在两种不同分类的metaprograming技术。metaprograming通常要么是static或者dynamic和homogeneous或者heterogeneous(另外一种分类,但是在这篇文章中我们不用担心这个)。 static(静态的)= 在编译时 dynamic(动态的)= 在运行时 homogeneous(同类的)= 输出语言和输入的相同 heterogeneous(不同类的)= 输出语言和输入语言不相同 metaprograming一种显而易见的格式是在为一种高级语言用编译器(或者interpreter解释器)创建机器代码。这是metaprograming的一种static heterogenous技术(尽管解释器可能使之dynamic)。这里有一些我曾经用过的一些关于metaprograming的有趣的例子。 c++模板或者与处理宏在编译时产生低级语言。- static and heterogeneous lisp表达式的值是在运行时计算的。- dynamic and hetergeneous 将要运行的autocad脚本(包括使用lisp,c#,vb(a)或者c++)产生的代码。 - dynamic and hetergeneous 声名一个sql语句,并且用它来查询数据库。 - dynamic and hetergeneous 这个系列的文章是关于dynamic metaprogramming,允许在运行时修改代码。更深一层的会更加复杂,例如使用dynamic metaprogramming技术在运行时重新定义方法,它允许程序进化,甚至于让系统随着时间的推移不断的学习。 lisp确实是最早的允许metaprograming的开发环境之一,首先,在求表达式的值时利用自身的能力(eval)并且在运行时重新定义函数(defun)。这对后来的autolisp程序员相当有帮助。当autolisp最初面世的时候,它是一种纯粹的解释语言,所以dynamic metaprogramming提供了相当多的自动化。为了在推出visual lisp以后继续在代码中使用metaprogramming技术,一种支持dynamic编辑的运行组件开始被使用。如果给函数的内部表达式提供入口还十分重要,只用在autolisp的代码中只需要很少的改动,尽管现在很少需要使用这样的案例(defun-q)。 我们可以看到dynamic metaprogramming的一条基本思路:根据定义,你或者需要在解释环境下工作,或者需要一个支持一些编辑的运行库。visual lisp支持这些,vba和.net也支持(通过clr)。 回到autolisp:一个非常普通的操作,定义一个字符串应用(read)然后调用它(eval)。这个字符串可以存储在一幅图中,一个text文件,一个外部数据库,或者在运行中产生。例如: command: (eval (read "(* 5 (getvar \"zoomfactor\"))")) 300 vba也可以通过eval()方法对dynamic metaprogramming提供本地化支持。 eval "msgbox thisdrawing.name" vb6不直接支持eval(),但是似乎你可以通过嵌入一个脚本控件,或者通过调用vba运行库来使用它。但是我不知道是否可以通过这种技术来操作autocad的一些特殊变量,比如一幅图。 在.net中使用 metaprogramming没有这么的自动化,但是是完全可以用的,我会在下一篇文章中介绍。
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)