5

我想知道任何人都可以解释 autolisp / visual lisp 的以下功能背后的设计原理吗?对我来说,它们似乎与公认的软件实践背道而驰……我错过了什么吗?

  • 默认情况下,所有变量都是全局变量(即,除非放在/函数参数中的 a 之后)
  • 从 AutoCAD 读取/写入数据需要将内容放入包含大量幻数的关联列表中。 10表示 x/y 坐标,90表示坐标列表的长度,63表示颜色等。好的,您可以将它们存储在一些常量中,但这意味着更多的全局变量,并且文档鼓励您直接使用幻数。
  • Lisp 是一种函数式语言,它鼓励通过迭代迭代进行递归编程,但是尾递归在视觉 lisp 中没有经过优化,导致可怕的调用堆栈——当然,除非你进行迭代。但是循环语法非常严格;例如,除非您在终止条件中放置某种标志,否则您不能跳出循环或从循环中返回值。结果,丑陋的代码。
  • 通常,您被迫在面对函数式编程的所有地方声明变量 - 那么为什么要使用函数式(-ish)语言呢?
4

3 回答 3

6

Lisp 不是一种语言,它是一组有时令人惊讶的不同语言SchemeClojure是该系列的功能性成员。Common Lisp 和像 Elisp 这样的更专业的品种并不是特别实用,并且本质上不鼓励函数式编程或递归。CL 实际上包括一个非常灵活的对象系统,一个极其灵活的迭代 DSL,并且不保证优化的尾调用(Scheme 方言可以,但不是一般的 Lisps;这是将“Lisp”视为单一语言的缺陷)。

现在我们已经弄清楚了,AutoLisp 是 1986 年基于 XLISP 早期版本(最早于1983 年发布)的实现。

面对当前公认的编程实践,它可能会飞起来的原因是它早于当前公认的编程实践。要记住的另一件事是,当今最便宜的上网本比程序员在 80 年代中期所期望的要强大数百倍。这意味着即使给定的功能被认为是优秀的,CPU 或内存限制也可能会阻止其在商业语言中的实现。

我从来没有专门用 Autolisp/Visual Lisp 编程过,你引用的东西听起来很烦人,但它可能有一些性能/内存优势,这在当时证明了它的合理性。

于 2012-02-02T18:03:23.840 回答
3

如果我没记错的话,AutoLisp 是 XLisp 早期版本的一个分支(一些消息来源声称它是 XLisp 1.0(参见这篇 C2 文章)。

XLisp 1.0 是一个 1-cell lisp(函数和变量共享相同的名称空间),但有一些相当奇怪的奇怪之处。

于 2012-02-02T17:41:17.957 回答
2

顺便说一句,您可以将动态范围添加到组合中,如果您不知道它是什么,请认为自己很幸运。但实际上并不是所有的四点都是 IMO 的大事:

  • “未声明的变量会自动创建为全局变量。” 与 CL 相同,不是(通过setq)吗?另一种选择是失败,这对于应该用于快速-n-脏脚本的语言来说不是一个非常有吸引力的选择。

  • “神奇数字”是 DXF 代码,您说得对,这是主要的不便之处,因为它们有时会随着 ACAD 版本的变化而变化(谢天谢地,很少)。就是这样。修复它需要大修,引入一些“模式”等等,为什么“他们”会打扰?AutoLISP 大约在 1992 年时处于其状态,从那以后就再也没有打扰过。Visual LISP 本身是一个完全不同且功能更强大的系统,但它对普通用户都是锁定的,并且只为一个目标服务 - 尽可能忠实地模拟旧的 AutoLISP(除非它添加了新的 VBA 相关功能在 1990 年代后半期,从那时起也被锁定)。

  • (while (not done) ...)那么难看。是的,没有尾部优化保证,就像 CL 和 Haskell 中没有一个一样(最后一个真的让我感到困惑 - 没有保证在没有 monad 的情况下在恒定空间中编码 Haskell 中的循环的方法 - 那怎么样?)。

  • “你被迫在所有地方声明 vars”在这里我不关注你。你声明它们是你应该声明它们 - 在函数的内部参数列表中。你指的还有哪些地方?我一个都不知道。

实际上,AutoLISP 最大的绊脚石是它的动态名称解析 IMO,但这就是 Xlisp 中的情况,仅在 Scheme 首次问世后几年。然后它也是它的不可变数据存储,但这主要是为了简化实现,并防止用户群产生过多的混乱和问题,我猜。

于 2012-02-05T00:17:53.480 回答