2013-06-03 32 views
3

我開始寫「混帳添加-p」這樣的代碼片段:Emacs lisp lambda with lexical binding?

(add-hook 
'diff-mode-hook 
(lambda()    
    (mapc (lambda(k) 
      (lexical-let ((kk k)) 
      (define-key diff-mode-map k 
       (lambda()(interactive) 
       (if (region-active-p) 
        (replace-regexp "^." kk 
            nil 
            (region-beginning) 
            (region-end)) 
        (insert kk)))))) (list " " "-" "+")))) 

它的工作原理,因爲我想,這只是醜陋「的詞彙,讓困擾我中間。 我不得不添加它,因爲嵌套的lambda沒有看到變量'k。 有沒有更好的方法來編寫這段代碼?我寧願一些神奇的功能 「lexic - 拉姆達,讓我寫:

(add-hook 
'diff-mode-hook 
(lambda()    
    (mapc (lexical-lambda(k) 
        (define-key diff-mode-map k 
        (lexical-lambda()(interactive) 
         (if (region-active-p) 
          (replace-regexp "^." k 
              nil 
              (region-beginning) 
              (region-end)) 
         (insert k)))))) (list " " "-" "+"))) 

回答

3
(mapc (lambda (k) 
     (define-key diff-mode-map k 
      `(lambda() 
      (interactive) 
      (if (region-active-p) 
       (replace-regexp "^." ,k 
           nil 
           (region-beginning) 
           (region-end)) 
       (insert ,k))))) 
     (list " " "-" "+")) 

另外,由於Emacs的24,您可以在本地實現詞法綁定。只需在文件頂部添加;; -*- lexical-binding: t -*-,並且您的代碼應該在沒有lexical-let包裝的情況下工作。 (請參閱C-h i g (elisp)Lexical Binding RETC-h i g (elisp)Using Lexical Binding RET。)

+0

謝謝,@danlei。我嘗試過使用相同的方法,但是我把反引號放在了錯誤的地方,它不起作用。 –

+0

不客氣。 – danlei