严格来说,autolisp的源文件只有2种,就是lspmnl文件,稍微扩大一点的话, dcl文件、prj文件、prv文件也都能算作是autolisp/visual lisp的源文件。

这里边,prj文件是所谓的工程文件,需要将源代码编译为fas的时候,就是通过prj来指定要包含的源文件, 以及相关的各种编译参数。prv文件的作用与prj类似,prv是用于将源代码、资源文件等打包编译为vlx的, prv可以直接引用prj

谈autolisp源文件的命名,很大程度上是在谈prj对文件名的要求,另外,可能也和autocad关于lisp插件搜索的内部机制有关。

不允许出现同名lsp文件

我们知道,autocad的lisp插件搜索机制,在不指定具体目录情况下,是直接在支持文件目录、信任文件目录中搜索的, 在不指定扩展名的情况下,是按*.vlx -> *.fas -> *.lsp的顺序搜索的。

从这里,其实就能看出来,autocad默认情况下是不考虑文件路径和扩展名的,它只认文件名,当试图加载2个同名的lisp插件时, 它会提示该插件已经加载过了。

prj文件中,存在同样的限制,同样不允许出现同名lsp文件,即使是处于两个不同目录下的,也是不允许的。 在手动编辑prj文件,令其包含2个同名lsp文件之后,通过visual lisp ide打开这个prj文件时,ide会直接报错。

不允许出现2个及以上的西文句号

在几十年以前,在dos时代,有个8.3的短文件名的规定,就是文件名的长度上限为8个字符,扩展名的长度上限为3个字符。 那个时候,文件命名是个颇为讲究的事情,因为你能用的只有8个字符那么长。后来,随着技术的进步,这个限制几乎不存在了, 大家实现了文件命名自由,开始放飞自我了。

放飞自我的表现之一,就是文件名很长很详尽,这当然是好事。只是,太长的文件名会大致阅读困难,因为人不是按单个字母去阅读的, 按单词阅读才是人类的习惯做法。

这个时候,文件名的不同单词之间用什么来分隔,就成了一个问题了。

很显然,空格并不是一个好的选择。除了空格之外,常见的有几种,比如使用_.-_在c语言以及c系语言中, 使用较多,包括python,通常也是使用_分隔文件名中的单词的。后两种,则在网络上和其他编程语言中使用较多。

大多数情况下,选用什么作为文件名的分隔符,只是一个个人偏好问题。只是,autolisp的源文件命名,并不属于这个“大多数情况”。 试图在prj文件中加入类似于*.*.lsp这样命名的文件时,一样会出现prj加载后报错,或者编译后的fas运行异常的情况。

这种对lsp文件名的特殊要求,个人推测,可能和prj文件的运行机制有关。prj文件实际上就是lsp文件, 其中的lsp文件名是字符串表示的,在prj加载执行时,可能会把文件名字符串转为符号,众所周知, lisp是不允许在符号中使用.的,当文件名包含有.时,自然就会报错了。

结语

总体来讲,lisp语言可以说是没什么限制的,无论标识符还是文件名,相对其他语言来说,限制都是很少的。具体到autolisp, 因为其历史太过悠久,autodesk也并没有及时为其添加新特性,它在源文件命名上的一些特殊要求,大概就是源于此吧。