2013-11-09 55 views
1

我知道Emacs 24引入了詞法作用域;這很棒,但我一直在進行詞彙範圍界定,我試圖從動態範圍界定的不同角度來看待。如何在Emacs lisp動態範圍內不關閉地工作

本來我只是做了我會一直做,依靠封閉:

(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)))))) 

終於理解爲什麼p是拉姆達運行時不確定後,我想出了這個給力P的評價在dolist的背景下,而不是在lambda運行時。

(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))))))))) 

這是不用關閉和詞法範圍界定來解決問題的經典解決方案嗎?

回答

1

我會這樣做,如果我想保持綁定在像你這樣的列表中。 我其實更喜歡爲每個命令拼寫出local-set-key

(defun save-before-call (f) 
    `(lambda() 
    (interactive) 
    (save-buffer) 
    (funcall #',f))) 

(add-hook 'cider-mode-hook 
    (lambda() 
    (mapc (lambda(x)(local-set-key 
        (kbd (car x)) 
        (save-before-call (cdr x)))) 
      '(("M-l" . cider-load-current-buffer) 
      ("M-e" . cider-eval-last-expression)))))