1

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

ラムダの実行時に p が未定義である理由を最終的に理解した後、ラムダの実行時ではなく dolist のコンテキストで 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)))))))))

これは、クロージャーと字句スコープなしで問題を解決するための古典的な解決策ですか?

4

1 に答える 1

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))))) 
于 2013-11-09T15:12:47.803 に答える