我不明白 Emacs 24 的新词法作用域功能为何如此出色的原因是我想不出没有它们就无法实现的任何新功能。例如,下面的闭包:
(setq lexical-binding t)
(defun f1 (num1)
(lambda (num2)
(setq num1 (* num1 num2))))
(fset 'f2 (f1 5))
==> (closure ((num1 . 5) t) (num2) (setq num1 (* num1 num2)))
(f2 5)
==> 25
(f2 2)
==> 50
可以使用常规动态范围来实现,如下所示:
(defun f1 (num)
(let ((tmpvar (make-symbol "num")))
(set tmpvar num)
`(lambda (num2)
(set ',tmpvar (* (eval ,tmpvar) num2)))))
(fset 'f2 (f1 5))
==> (lambda (num2) (set (quote num) (+ (eval num) num2)))
(f2 5)
==> 25
(f2 2)
==> 50
(fset 'f3 (f1 9))
==> (lambda (num2) (set (quote num) (+ (eval num) num2)))
(f3 3)
==> 27
(f3 2)
==> 54
(f2 10)
==> 500
好的,所以并不是所有的语言都有类似于 elisp 的 uninterned 符号的东西,所以我理解为什么词法作用域在他们的情况下如此出色。但是 elisp 呢?由于词法作用域,你能想到我现在(从 Emacs 24 开始)我以前不能做的任何事情吗?