Emacs Lisp和Common Lisp之间有哪些主要区别?

use*_*032 41 emacs elisp common-lisp

我想学习lisp语言,因为我的编辑器是emacs,我更喜欢emacs lisp.

任何人都可以给我一些建议来学习lisp,emacs lisp或常见的lisp吗?

这两者之间的主要区别是什么?

ata*_*lor 35

有相当多的交叉,特别是在初学者水平,所以无论你开始哪个将主要转移到另一个.

一些主要差异:

  • elisp传统上使用动态范围规则; Common Lisp使用词法范围规则.使用动态作用域,函数可以访问在调用函数中声明的局部变量,并且通常不受欢迎.Emacs有一个lexical-let模拟词法作用域的表单,而emacs的最新版本允许逐个函数的可选词法作用域.

  • elisp没有闭包,这使得编写功能和currying很困难.有一个apply-partially功能与currying类似.请注意,lexical-letEmacs 24中引入的表单可以通过词法作用域生成闭包.

  • 很多随着时间的推移而构建的Common Lisp库在elisp中不可用.elisp cl包提供了一个子集

  • elisp不进行尾调用优化.

  • 当然,"通常不受欢迎"评论不适用于Emacs本身,动态范围界定非常有用. (7认同)
  • 现在Emacs Lisp有lexical let,compat库叫做cl-lib而不是cl (4认同)
  • Demetri:因为Emacs如此有用*的主要原因之一是它的灵活性 - 能够根据自己的要求进行弯曲 - 动态绑定是其中的关键部分.如果没有动态绑定,你就会更加局限于按照别人*认为应该完成的方式做事.当然,这种灵活性和适应性是人们坚持使用Emacs的最大原因之一,这反过来导致更多的人为它编写代码以使其更好,这导致Emacs本身在改进. (3认同)
  • 仅在此处添加一些当前信息,Emacs 24在指定时为Emacs Lisp添加了词法绑定。 (2认同)
  • 更多细节:从 Emacs 24 开始,可以逐个文件地打开词法绑定。在两个 Lisps 中,白痴的特殊变量和词法闭包指南中提到的“特殊变量的普遍性”造成了一个很容易解决的麻烦。在 Common Lisp 中,它是通过耳罩约定和命名空间的组合来解决的。在 Emacs Lisp 中,它是通过两个命名约定来解决的: 1. 特殊变量的名称中必须有连字符。2. 词法闭包中引用的词法变量的名称中不得有连字符。此外,Emacs Lisp 有缓冲区本地绑定的概念。 (2认同)

Dre*_*rew 6

这些Emacs-Wiki页面提供有关两个Lisps之间的关系及其差异的一些信息: