关于 lexical-binding vs dynamic binding,推荐一篇博文

一直不太清楚两者的区别。看到这篇博文不错,推荐给大家:

3 个赞

纠正:

  1. Common Lisp 是 lexical 和 dynamic 混合的,默认 lexical,用 DEFPARAMETER 或 DEFVAR 在顶层定义的是变量是 dynamic 的。开了 lexical 的 Emacs Lisp 和 CL 一样。
[1]> (defparameter foo 1)
FOO
[2]> (defun x (y) (+ y foo))
X
[3]> (x 4)
5
[4]> (let ((foo 3)) (x 4))
7
  1. Lisp Machine Lisp 支持 lexical binding,并且在后期版本(ZetaLisp)中默认使用 lexical binding。(实际上它和 CL 并没有太多区别)


另外推薦 RMS 在去搞 GNU 之前写的 Lisp Machine Manual 中对 Closure 的讲解。

https://hanshuebner.github.io/lmman/fd-clo.xml#What%20a%20Closure%20Is-section

2 个赞

文章里有个链接,里面有两句话很不错:

objects are merely a poor man’s closures.

Closures are a poor man’s object.

看晕了,到底谁是谁的穷人版?

里面有mailing list的链接,有详解吧好像,我没看完 你看了可以给大家整理复述一下

我觉得这两句对于不熟悉物件导向的人来说会造成很大的困扰。

更可况 Emacs Lisp 中并没有 Object 这个概念。

两者是否相等是和具体用的编程语言的设计相关的。

请教下, closure是lisp首先应用的吗?

不是。 1970 年在 PAL (Pedagogic Algorithmic Language)语言先应用的。PAL 1967 年就在 MIT 作为教学语言实现了。

2 个赞