(uninterned symbol を定義する!! "symbol" は interned symbol を意味する)
GNU Emacs Lisp でシンボルがどのように作られるかを理解するためには、Lisp がそれ をどのように読み込むかを知る必要があります。 Lisp が (同じ)"文字の集まり" を読 み込むと (同じ)シンボルを見い出すことを保証することが重要で、これができないと 大変なことになります。
Lisp は名前内の全ての文字を読み込み、それらの文字を obarray と呼ばれるベクトル にハッシュします。ハッシングは、あるものを効率良く検索するための 1 つの方法で す。電話帳で Jan Jones を検索する際、始めのページから終りのページまで探すので はなく 'J' から始めますが、これは簡単なハッシングです。配列中の同じ要素 (同じ bucket)にハッシュされるシンボルが複数存在する場合、Lisp はその中から対象の名前 を見い出します。
(対象となる)シンボルが見つかった場合それが返されます。見つからない場合、(新し く)シンボルが作られ obarray の対応する場所にリンクされます。
obarray にリンクされてないと、(その名前が読み込まれた際)それを検索する方法が存 在しないことになります。このようなシンボルはその obarray に対し、uninterned シ ンボルであると呼ばれます。このため、別のシンボルが同じ名前を持つことが可能で す。しかし、これはあまり一般的なものではありません。
以下に示す関数は(全て)、名前と (そのいくつかは) obarray をアーギュメントとして 取ります。名前がストリングでなかったり obarray がベクトルでない場合、エラーに なります。
Function: symbol-name symbol
この関数は、 symbol の名前のストリングを返します。シンボルの名前セルを変え ると、そのシンボルの名前が変ります。そのストリングを文字の置き換え等で変え ても、シンボルの名前を変えることになりますが、このようなことはしないように して下さい。 (そうではなく) 必要な名前を持つシンボルを(新しく)作るようにし て下さい。
(symbol-name 'foo) => "foo"
Function: make-symbol name
名前が name である、intern されていないシンボルを(新しく)アロケートして返 します( name はストリングでなくてはいけません)。 (シンボルの)値と関数定義 は void で、プロパティーリストは nil です。以下の例において、 (ストリング が intern されてないため) sym の値は foo に eq ではありません。
(setq sym (make-symbol "foo")) => foo (eq sym 'foo)
=> nil
Function: intern name &optional obarray
この関数は、名前が name であるシンボルを返します。 obarray が与えられた場 合、それは用いる obarray を指定します。これはデフォルトでグローバル変数 obarray の値になります。
(setq sym (intern "foo")) => foo (eq sym 'foo) => t
Function: intern-soft name &optional obarray
この関数は、名前が name であるシンボルか、 (そのシンボルがまだ存在していな い場合) nil を返します。 obarray が与えられた場合、それは用いる obarray を 指定します。これはデフォルトでグローバル変数 obarray の値になります。
(intern-soft "frazzle") ;そのようなシンボルは存在しない。 > nil (make-symbol "frazzle") ;intern されてないものを作る。 > frazzle (intern-soft "frazzle") ;これは見つけることができない。 > nil (setq sym (intern "frazzle")) ;intern されたものを作る。 > frazzle (intern-soft "frazzle") ;これは見つけることができる。 > frazzle (sq sym 'frazzle) ;そして、これは同じものである。 > t
Variable: obarray
このグローバル変数は、intern と read で用いる (標準の) obarray です。この ベクトルは、最良の結果を得るためには素数 (現在の所 511) の長さを持たなくて はいけません。各要素は、(その名前がその bucket にハッシュされた) intern さ れたシンボルです。 (同じ)bucket にハッシュされたシンボルが複数存在する場 合、それは次のシンボルへの(ユーザーには見えない)内部リンクを持ちます。この (リンクにおける)順番は重要ではありません。
Function: mapatoms function &optional obarray
この関数は、 obarray 中の全てのシンボルに対し function を適用します。 nil を返します。 obarray が与えられない場合、デフォルトで obarray の値 (全ての シンボルに対する通常の obarray) を用います。
(setq count 0) => 0 (defun count-syms (s) (setq count (1+ count))) => count-syms (mapatoms 'count-syms) => nil count => 1871