Emacs Lisp 和 Common Lisp 之间的主要区别是啥? [关闭]
Posted
技术标签:
【中文标题】Emacs Lisp 和 Common Lisp 之间的主要区别是啥? [关闭]【英文标题】:What are the major differences between Emacs Lisp and Common Lisp? [closed]Emacs Lisp 和 Common Lisp 之间的主要区别是什么? [关闭] 【发布时间】:2012-01-16 00:52:05 【问题描述】:我想学lisp语言,因为我的编辑器是emacs,所以我更喜欢emacs lisp。
谁能给我一些学习 lisp、emacs lisp 或 common lisp 的建议?
这两者之间的主要区别是什么?
【问题讨论】:
从这里开始:en.wikipedia.org/wiki/Elisp 底部有一些不错的链接。 点击链接:它有关于学习 elisp 的良好“官方”信息。 gnu.org/software/emacs/emacs-lisp-intro/html_mono/… 如果你想因为 emacs 而学习 Lisp - 学习 Emacs Lisp。如果你想开发真正的应用程序,最好学习 Common Lisp 甚至 Clojure。 相关:***.com/questions/3840443/… 这是一个有用的问题。不应该关闭:/ 【参考方案1】:有相当多的交叉,尤其是在初学者级别,所以无论你从哪个开始,大部分都会转移到另一个。
一些主要区别:
ELisp 传统上使用动态范围规则; Common Lisp 使用词法范围规则。使用动态范围,函数可以访问在调用函数中声明的局部变量,并且通常已经失宠。从 Emacs 24 开始,Emacs 允许在逐个文件的基础上进行可选的词法作用域(并且核心发行版中的所有文件都在逐步转换)。
动态范围的 ELisp 没有闭包,这使得组合函数和柯里化变得困难。有一个 apply-partially
函数,其工作原理类似于柯里化。请注意,Emacs 24 中引入的 lexical-let
形式可以通过词法作用域生成闭包。
随着时间的推移构建的许多 Common Lisp 库在 elisp 中不可用。 elisp cl
包提供了一个子集
elisp 不进行尾调用优化。
【讨论】:
“普遍失宠”的评论当然不适用于 Emacs 本身,因为动态范围非常有用。 只是在这里添加一点当前信息,Emacs 24 在指定时为 Emacs Lisp 添加了词法绑定。 现在 Emacs Lisp 有词法 let 并且兼容库被称为 cl-lib 而不是 cl 更多细节:从 Emacs 24 开始,可以逐个文件地打开词法绑定。在这两个 Lisp 中,Idiot 的特殊变量和词法闭包指南中提到的“特殊变量的普遍性”造成了一个很容易解决的问题。在 Common Lisp 中,它通过耳罩约定和命名空间的组合来解决。在 Emacs Lisp 中,它通过两种命名约定来解决: 1. 特殊变量的名称中必须有连字符。 2. 词法闭包中引用的词法变量的名称中不能有连字符。此外,Emacs Lisp 具有缓冲区本地绑定的概念。 Demetri:因为 Emacs 如此有用的主要原因之一是它的灵活性——能够根据你自己的要求调整它——而动态绑定是一个关键其中的一部分。如果没有动态绑定,您将更加受限于其他人认为应该做的事情。当然,这种灵活性和适应性是人们坚持使用 Emacs 的最大原因之一,这反过来又导致更多的人为它编写代码以使其变得更好,从而导致 Emacs 本身得到改进。【参考方案2】:这些 Emacs-Wiki 页面提供了一些关于两个 Lisps 之间的关系及其差异的信息:
http://www.emacswiki.org/emacs/CommonLisp http://www.emacswiki.org/emacs/EmacsLisp http://www.emacswiki.org/emacs/EmacsLispLimitations【讨论】:
从链接中复制信息,至少是一些亮点 @NicSzerman:好评;我同意。现在太懒了。以上是关于Emacs Lisp 和 Common Lisp 之间的主要区别是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?
Common Lisp : Lexical varible , Dynamic varible ——作用域,生存期 ——environment : 绑定, 闭包与共享对象