次の emacs lisp ファイルは、アリスが init ファイルで字句的にバインドされたローカル変数を使用し、ボブが init ファイルでグローバルな特殊変数としてfoo
定義し、アリスがボブの init ファイルコードの一部を彼女自身の init ファイルに借用した場合に何が起こるかを確認するためのものです。それが特別になることを知っています。foo
defvar
foo
;; -*- lexical-binding: t; -*-
;; Alice init file
;; Alice defining alice-multiplier
(defun alice-multiplier-1 (foo)
(lambda (n) (* n foo)))
(defun alice-multiplier-2 (num)
(let ((foo num))
(lambda (n) (* n foo))))
;; Alice using alice-multiplier
(print
(list
:R1 (mapcar (alice-multiplier-1 10) (list 1 2 3))
:R2 (mapcar (alice-multiplier-2 10) (list 1 2 3))))
;; from Bob's code
;; ...
(defvar foo 1000)
;; ...
;; Alice using alice-multiplier
(print
(list
:R3 (mapcar (alice-multiplier-1 10) (list 1 2 3))
:R4 (mapcar (alice-multiplier-2 10) (list 1 2 3))))
出力:
(:R1 (10 20 30) :R2 (10 20 30))
(:R3 (10 20 30) :R4 (1000 2000 3000))
結果 R1 と R2 は、期待どおりです。結果 R4 は defvar のドキュメントと一致していますが、アリスがボブのコードを読まなければ驚くかもしれません。
R3は意外だった。なぜR3はこうなった?
R4といえば、アリスが
foo
他人に特別にされないようにするにはどうすればいいですか? たとえば、foo
彼女が init ファイルまたは emacs パッケージの 1 つで使用するレキシカル ローカル変数である(defvar foo "something")
可能性があり、たまたま使用するパッケージの一部である可能性があるか、またはfoo
将来のバージョンで導入される新しい特殊変数名の 1 つである可能性があります。 Emacsの。Alice が Emacs に「このファイルでは、外部からのコードが同じ名前の特殊変数を使用している場合でも、foo は常に字句的であるべきです」と言うファイルに入れることができるものはありますか?