找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 786|回复: 0

[分享] Metaprogramming with AutoCAD

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-5-18 19:02:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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没有这么的自动化,但是是完全可以用的,
接下来我们来看看.NET如何实现,首先让我们把目光转向C#和VB.NET。

PS:作者还有第三篇文章,用于介绍.NET家族新的开发语言F#的元编程技术,大家如果有兴趣可以到Kean的Blog里面阅读,地址through-the-interface.typepad.com,在此我们略过。

.NET不支持类似Eval()函数的方法,但是,它提供的痛惜却更加有趣。CLR提供了执行CodeDomProvider协议的用于编译和执行.NET语言源代码的接口。

举例来说,Microsoft.CSharp 命名空间提供了允许你从其他.NET语言编译C#原代码的CSharpCodeProvider类;VB.NET也一样,Microsoft.VisualBasic 包含了VBCodeProvider。

这就是说,我们可以很轻松的利用.NET在homogeneous 或者heterogeneous 模式实现dynamic metaprogramming 。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 21:57 , Processed in 0.463138 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表