"let"绑定不适用于后续的"let"绑定?

Sup*_*ver 1 emacs elisp

我学习了Emacs Lisp,因为我想自定义我的编辑器并且要清楚我对动态绑定的工作原理有点困惑.

这是一个例子:

(setq y 2)    

(let ((y 1)
      (z y))
  (list y z))

  ==> (1 2)
Run Code Online (Sandbox Code Playgroud)

结果我回来了=> (1 2) 请一些人解释一下究竟发生了什么.我尝试使用框架的概念来解释它,每个框架创建本地绑定,但它似乎在这里以不同的方式工作.

为什么它不在最近的帧中取最接近的'y'值?

如果可以详细描述这里发生了什么,我会很高兴.

提前致谢.缺口.

Vat*_*ine 6

在emacs lisp中(与许多lisps一样),将绑定的值let在"外部"环境中并行计算let.

例如,以下是(大致)等价的:

(let ((a b)
      (b a))
  ...)

=>

(funcall (lambda (a b) ...) b a)
Run Code Online (Sandbox Code Playgroud)

如果你想按顺序绑定东西,你应该使用let*,这可以做你期望let的事情.