1

例として、put関数内でxプロパティとその値をグローバルに作成します。

(defun foo ()
  (put 'spam 'x 1))

(foo)

(get 'spam 'x) ; -> 1

シンボル プロパティをローカルに設定する方法はありますか?

4

3 に答える 3

3

いいえ、'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-letclパッケージ (Emacs に含まれています) を使用することもできます。

于 2013-11-11T00:52:01.460 に答える