位置付きシンボルとは、ベアシンボルと呼ばれるシンボルと、位置と呼ばれる非負の固定数を組み合わせたものです。位置付きシンボルは、多くの場合ベアシンボルと同様に動作しますが、それ自体はシンボルではありません。むしろ、ベアシンボルと位置の両方を持つオブジェクトです。位置付きシンボルはシンボルではないため、obarrayにエントリを持ちませんが、そのベアシンボルは通常持ちます(シンボルの作成とインターニングを参照)。
バイトコンパイラは位置付きシンボルを使用し、各シンボルの出現位置を記録して、警告やエラーメッセージにその位置を利用します。通常、それ以外の目的で使用すべきではありません。そうすると、eq や equal といった基本的な Emacs
関数で予期しない結果を招く可能性があります。
位置付きシンボルの印刷表現には、印刷表現と読み取り構文で概説されているハッシュ表記が用いられます。形式は
‘#<symbol foo at 12345>’
となります。読み取り構文はありません。print 操作の前後で変数 print-symbols-bare に non-nil
をバインドすることで、シンボル単体のみを印刷させることができます。バイトコンパイラは、コンパイル済みの Lisp
ファイルに出力を書き出す前にこの処理を行います。
フラグ変数 symbols-with-pos-enabled が nil でない場合、位置を持つシンボルは通常、単なるシンボルと同様に振る舞う。例えば、‘(eq (position-symbol 'foo 12345) 'foo)’ は t を返し、equal
も同様に位置を持つシンボルを単なるシンボルとして扱う。
symbols-with-pos-enabled が nil であるとき、位置を持つ記号は記号としてではなく、それ自体として振る舞う。例えば、‘(eq (position-symbol 'foo 12345) 'foo)’ は nil を返し、equal
も同様に、位置を持つ記号を単なる記号とは等しくないものとして扱う。
Emacsではほとんどの場合 symbols-with-pos-enabled が nil となりますが、バイトコンパイラとネイティブコンパイラは実行時にこれを t にバインドするため、この場合 Emacs の動作がわずかに遅くなります。
通常、位置を持つシンボルは、バイトコンパイラがリーダー関数 read-positioning-symbols を呼び出すことで作成されます(入力関数を参照)。また、関数 position-symbol を用いて作成することも可能です。
この変数は、位置指定記号が出力されず、かつ本節の後半で定義される関数の引数でもない場合の挙動に影響します。この変数が nil
以外の場合、そのような位置指定記号は通常記号と同様に動作します。それ以外の場合は、記号としてではなく、それ自体として動作します。
non-nil にバインドされている場合、Lisp
プリンタは位置を持つシンボルのベアシンボルのみを出力し、位置は無視します。それ以外の場合、位置を持つシンボルはシンボルとしてではなく、それ自体として出力されます。
この関数は、object が位置を持つシンボルであれば t を、そうでなければ nil を返します。symbolp とは異なり、この関数は symbols-with-pos-enabled を無視します。
この関数は、位置 sym を持つシンボルのベアシンボルを返すか、すでにシンボルである場合は sym 自体を返します。それ以外の型のオブジェクトに対しては、エラーを発生させます。この関数は symbols-with-pos-enabled を無視します。
この関数は、位置 sympos を持つシンボルから、その位置(非負の
fixnum)を返します。それ以外の型のオブジェクトに対しては、エラーを通知します。この関数は symbols-with-pos-enabled を無視します。
Make a new symbol with position. The new object’s bare symbol is
taken from sym, which is either a symbol, or a symbol
with position whose bare symbol is used. The new object’s position is
taken from pos, which is either a nonnegative fixnum,
or a symbol with position whose position is used. Emacs signals an error if
either argument is invalid. This function ignores symbols-with-pos-enabled.