例として、put
関数内でx
プロパティとその値をグローバルに作成します。
(defun foo ()
(put 'spam 'x 1))
(foo)
(get 'spam 'x) ; -> 1
シンボル プロパティをローカルに設定する方法はありますか?
いいえ、'spam
常に同じシンボルであるため、プロパティをローカルに設定することはできません。
これがあなたの状況に適しているかどうかはわかりませんが、新しいシンボルを作成してその上にプロパティを置くことができます. シンボルは関数の外では使用できず、プロパティも使用できないためです。
(defun foo ()
(let ((private (make-symbol "private")))
(put private 'x 1)
(get private 'x)))
(foo) ;=> 1
(get 'private 'x) ;=> nil
make-symbol
これは、によって返される(make-symbol "private")
シンボルがグローバルおよび他のすべてのシンボルとは異なるシンボルであることを意味し'private
ます。詳細については、シンボルの作成とインターンに関する Emacs マニュアルのセクションを参照してください。
Emacs はbuffer-local variablesもサポートしていますが、これはまったく同じではありません (シンボルの値は特定のバッファーに対してローカルですが、シンボル自体とそのプロパティは依然としてグローバルです)。
値を名前にローカルでバインドする必要がある場合は、Emacs 24 のレキシカル バインドのサポートを使用するか、古いバージョンを使用している場合lexical-let
はcl
パッケージ (Emacs に含まれています) を使用することもできます。