ローカル変数

let

Emacs Lisp の let ってバッファローカルな変数を上書きしてるような挙動を見せる。let フォームから脱出するときに元に戻す、と。いつの日かソースを読めばはっきりわかるんだろう。多分読まないけど。

(defvar my-var nil)
(make-variable-buffer-local 'my-var)

(defun my-func ()
  (interactive)
  (let ((buffer (get-buffer-create "*TRASH*")))
    (with-current-buffer buffer
      (setq my-var "buffer value"))
    (let ((my-var "local value"))
      (princ (buffer-local-value 'my-var buffer)))))

*scratch* バッファで my-func を実行すると
-> buffer value

*TRASH* バッファに移動して my-func を実行すると
-> local value

そのまま *TRASH* バッファで my-var を評価すると
=> buffer value

lambda

そういえば lambda に置き換えるとどうなるんだ?とやってみるとやっぱり let と一緒だった。

(defun my-func ()
  (interactive)
  (let ((buffer (get-buffer-create "*TRASH*")))
    (with-current-buffer buffer
      (setq my-var "buffer value"))
    ((lambda (my-var)
       (princ (buffer-local-value 'my-var buffer))) "function arg")))

*scratch* バッファで my-func を実行すると
-> buffer value

*TRASH* バッファに移動して my-func を実行すると
-> function arg