我知道 Emacs 24 引入了词法作用域;这很好,但我一直在使用词汇范围,我试图从不同的角度看待动态范围。
最初我只是做了我一直做的事情,依靠闭包:
(add-hook 'cider-mode-hook
(lambda ()
(dolist (p '(("M-l" . cider-load-current-buffer)
("M-e" . cider-eval-last-expression)))
(local-set-key
(kbd (car p))
(lambda () (interactive) (save-buffer) (cdr p))))))
在最终理解为什么在 lambda 运行时 p 未定义之后,我想出了这个来强制在 dolist 的上下文中而不是在 lambda 运行时对 p 进行评估。
(add-hook 'cider-mode-hook
(lambda ()
(dolist (p '(("M-l" . cider-load-current-buffer)
("M-e" . cider-eval-last-expression)))
(local-set-key
(kbd (car p))
(cons 'lambda `(() (interactive) (save-buffer) (funcall (quote ,(cdr p)))))))))
这是在没有闭包和词法作用域的情况下解决问题的经典解决方案吗?