AutoCAD的第1版,发布于1982年12月,到现在已经40多年的历史了。几年之后,1986年1月, 带有全功能的AutoLISP的AutoCAD 2.18版发布了。算起来,AutoLISP面世也快40年了。

从很多方面来讲,拿lisp作为二次开发的编程语言都是合理又恰当的选择。

当时那个年代,除了lisp,其实也没有太多其他的选择。今天红得发紫的javascript、python、lua, 要过好多年十来年才面世。连tcl,也是在1987年秋天,在autolisp发布一年多快两年之后,才有了构想, 1988年春才有了第1版tcl。

lisp语法简单,简单到几乎没有语法,有REPL,写代码的时候是“所见即所得”,非常适合作为二次开发的脚本语言。 事实上,AutoLISP到现在可能仍然是AutoCAD最受欢迎的二次开发语言,其官方论坛在所有的二次开发论坛当中是人气最旺的。

基本上,AutoLISP确实简单,这个结论本身是站得住脚的。

但是,经过几十年的发展变化之后,无论多简单的东西,都有可能变得十分复杂,AutoLISP也是如此。 这里给出几个简单的例子。

生成图元的方法

图元,粗略来讲,就是各种图形元素,比如1个点、1条线。AutoCAD的主要功能就是画图改图,生成图元自然是二次开发的根本需求。

在AutoLISP中,生成图元,至少有3种(类)方法,

  • 调用AutoCAD内置命令,
  • 使用entmake
  • 使用vla-add***系列函数,

这里说的AutoLISP是包括 Visual LISP 在内的笼统的说法。

这其中,entmake函数,它还有一个变种entmakex。没错,函数式编程语言就是函数多,LISP就是最经典的函数式编程语言。

生成图元,这样的一件事,就有3中方法,和“只用一种方法做一件事”相比,是不是复杂得不要不要的?

调用AutoCAD内置命令的方法

在上面三种生成图元的方法当中,调用AutoCAD内置命令的方法,其实也有3种,

  • command 函数
  • vl-cmdf 函数
  • command-s 函数

这个顺序是它们在AutoLISP中出现的顺序,vl-cmdf是跟着 Visual LISP一起引入的,command-s 是在AutoCAD 2012 版引入的。

调用内置命令,为什么要搞3个函数呢?

我也不知道实情。

我知道的是调用内置命令这个功能非常重要,重要到可以把其他的生成图元的方式都砍掉只保留这个。 有一些讲AutoLISP开发的书籍,就反复强调对这个功能的应用,用好了这个功能,足够做出来很好用的cad插件了。

所以,给重要的关键的功能,多提供几个函数,似乎也说得过去。

只是,做一件事情有三种方法,这终究是增加了这个事情的复杂性。

没那么简单

没那么简单。

这就是结论。