有人能向我解释Autolisp/visual lisp背后的设计决策吗



我想知道有人能解释一下autolisp/visual lisp以下功能背后的设计原理吗?在我看来,它们似乎与公认的软件实践背道而驰。。。我是不是错过了什么?

  • 默认情况下,所有变量都是全局变量(即,除非放在函数参数中的/之后)
  • 从autocad读取/写入数据需要将数据放入一个包含大量幻数的关联列表中。10表示x/y坐标,90表示坐标列表的长度,63表示颜色等。好吧,你可以将这些存储在一些常量中,但这意味着更多的全局值,文档鼓励你直接使用幻数
  • Lisp是一种函数式语言,它鼓励通过递归而不是迭代进行编程,但尾递归在可视化Lisp中没有得到优化,导致了可怕的调用堆栈——当然,除非你迭代。但是循环语法限制性很强;例如,除非在终止条件中放入某种标志,否则不能从循环中中断或返回值。结果,丑陋的代码
  • 一般来说,你被迫到处声明变量,这与函数式编程背道而驰——那么为什么要使用函数式语言呢

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

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

它可能会与当前公认的编程实践背道而驰的原因是,它早于当前公认的编程实践。另一件需要记住的事情是,如今最便宜的上网本的功能是程序员在80年代中期所期望的几百倍。这意味着,即使给定的功能被认为是优秀的,CPU或内存的限制也可能阻止了它在商业语言中的实现。

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

如果我没记错的话,AutoLisp是早期版本XLisp的派生(一些来源声称它是XLisp 1.0(请参阅这篇C2文章)。

XLisp 1.0是一个单单元lisp(函数和变量共享相同的名称空间),有一些奇怪的地方

您可以将动态作用域添加到混合btw中,如果您不知道它是什么,就认为自己很幸运。但事实上,并不是你所有的四点都是那么重要IMO:

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

  • "幻数"是DXF代码,这是一个很大的不便,因为它们有时会随着ACAD版本的变化而变化(谢天谢地,很少)。事情就是这样。修复它需要一次重大的改革,引入一些"模式"什么的,为什么"它们"会麻烦?AutoLISP大约在1992年就处于其状态,此后再也没有遇到过麻烦。Visual LISP本身是一个完全不同的、功能更强大的系统,但它对普通用户来说都是被锁定的,并且只为一个目标服务——尽可能忠实地模仿旧的AutoLISP(除了它在20世纪90年代后半叶添加了与VBA相关的新功能,并且从那时起也被锁定)。

  • (while (not done) ...)并不是那么丑陋。是的,没有尾部优化的保证,就像CL和Haskell中没有一样(最后一个真的让我很困惑——没有monad,就没有保证在恒定空间中用Haskell编码循环的方法——怎么样?)。

  • "你被迫到处宣布vars"在这里我不跟着你。在函数的内部参数列表中,按照应该声明的方式声明它们。你说的其他地方是什么?我不知道有。

事实上,AutoLISP最大的障碍是其动态名称解析IMO,但在Scheme首次推出几年后,它在Xlisp中就是这样。还有它的不可变数据存储,但这样做主要是为了实现的简单性,我想是为了防止用户群产生太多混乱和问题。

最新更新