ローカル変数
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