Go to the first, previous, next, last section, table of contents.

シンボルの作成と interning

(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


Go to the first, previous, next, last section, table of contents.