位置つきシンボル(symbol with position)とはbareシンボル(bare symbol: 裸のシンボル)と位置(position)と呼ばれる非負のfixnumを合わせたシンボルのことです。位置つきシンボルが多くの場合はbareシンボルと同様に振る舞うとしても、これはシンボルではなくbareシンボルであり位置でもあるようなオブジェクトなのです。位置つきシンボルはシンボルではないので、そのbareシンボルが通常はobarrayにあったとしても(シンボルの作成とinternを参照)、位置つきシンボルのエントリーはありません。
バイトコンパイラーは位置つきシンボルを使用してシンボルそれぞれの出現位置を記録、その位置を警告メッセージやエラーメッセージで使用します。通常はこれらを他の用途に用いるべきではありません。これを行うことによりeq
やequal
のようなEmacsの基本関数で予期せぬ結果が生じるかもしれません。
位置つきシンボルのプリント表現には、プリント表現と読み取り構文で概説したハッシュ表記が使用されます。‘#<symbol foo at
12345>’のようなプリント表現であり、入力構文はありません。プリント操作の前後で変数print-symbols-bare
を非nil
にバインドすれば、bareシンボルだけをプリントさせることができます。バイトコンパイラーはコンパイル済みLispファイルへ書き込む前にこれを行っています。
フラグ変数symbols-with-pos-enabled
が非nil
の場合には、位置つきシンボルは通常はそのbareシンボルのように振る舞います。たとえば‘(eq
(position-symbol 'foo 12345)
'foo)’はt
となり、equal
は位置つきシンボルをそのbareシンボルのように扱うのです。
symbols-with-pos-enabled
がnil
の場合には位置つきシンボルはシンボルではなく本来のように振る舞います。たとえば‘(eq
(position-symbol 'foo 12345)
'foo)’はnil
となり、equal
は位置つきシンボルとそのbareシンボルは異なるものとして扱います。
Emacsではsymbols-with-pos-enabled
はほとんどの場合にはnil
ですが、バイトコンパイラーやネイティブコンパイラーは実行中にこれをt
にバインドします。この間はEmacsの実行が少し低速になります。
位置つきシンボルは通常はバイトコンパイラーがリーダー関数read-positioning-symbols
を呼び出すことによって作成されます(入力関数を参照)が、関数position-symbol
によって作成することもできます。
この変数は位置つきシンボルをプリントするとき以外、およびこのセクションで後述するいずれの関数の引数ではない場合における位置つきシンボルの振る舞いに影響を与える。この変数がnil
なら、位置つきシンボルはそのbareシンボルと同じように振る舞い、それ以外の場合にはシンボルではなく本来のように振る舞う。
非nil
にバインドされていると、Lispプリンターは位置つきシンボルの位置は無視してbareシンボルだけをプリントする。それ以外の場合にはシンボルではなく位置つきシンボル自体をプリントする。
この関数はobjectが位置つきシンボルならt
、それ以外はnil
をリターンする。symbolp
とは異なり、この関数はsymbols-with-pos-enabled
を無視する。
この関数は位置つきシンボルsymのbareシンボル、symがすでにシンボルならそれ自体をリターンする。それ以外のタイプのすべてのオブジェクトにたいしてはエラーをシグナルする。この関数はsymbols-with-pos-enabled
を無視する。
この関数は位置つきシンボルsymposの位置(非負のfixnum)をリターンする。それ以外のタイプのオブジェクトの場合にはエラーをシグナルする。この関数はsymbols-with-pos-enabled
を無視する。
新たな位置つきシンボルを作成する。新たなオブジェクトのbareシンボルはsymから取得される。symはシンボル、あるいは位置つきシンボルを指定でき、位置つきシンボルの場合にはそのbareシンボルが使用される。新たなオブジェクトの位置はposから取得される。posは非負のfixnum、あるいは位置つきシンボルを指定でき、位置つきシンボルの場合にはその位置が使用される。いずれに無効な引数が指定された場合には、Emacsはエラーをシグナルする。この関数はsymbols-with-pos-enabled
を無視する。