Subsections

symbolとパッケージ

symbol

symbolは、いつでも唯一であることが保証され、パッケージに収容される。 1つのパッケージのなかに、その他の symbolとしておなじprint-nameを持っていることはあるが、symbol自体がコピーされることはない。 symbolがリーダに読まれるとき、symbolオブジェクトは、自動的に生成され、 1つのパッケージに収容される。 そのパッケージは、パッケージ名にコロン(:)を付け加えた接頭語によって 記すことができる。 そのようなパッケージ接頭語がないならば、symbolはlisp:*package* の値にある主なパッケージに収容される。 全てのsymbolは、1つのホームパッケージを持っている。 もしsymbolがそのようなホームパッケージを持っていないならば、 収容されていないsymbolと言われる。 収容されていないsymbolは、gensymmake-symbol関数によって 作ることができ、表示のときは、"#:"接頭語がつけられる。 これらのsymbolは収容されていないので、そのような2つのsymbolが同じ print-nameを持っていた場合、等しいことが保証されない。

ふつう、lispリーダがsymbolに出会ったとき、リーダは自動的に symbolのprint-name文字列を大文字に変換する。 したがって、例えば(symbol-name 'car)と入力したとすると、 EusLispは、"car"の代りに"CAR"と答える。 (make-symbol "car")は、carCARの代りに\includegraphics[width=7.5cm]{fig/threadobj.ps}car\includegraphics[width=7.5cm]{fig/threadobj.ps} を返す。 もし、小文字から構成されるsymbolをリーダに作らせたい場合、 $ \backslash$$ \vert...\vert$のようなエスケープを用いること。



symbolp object [関数]

objectがクラスsymbolかそのサブクラスのインスタンスであったならば、Tを返す。


symbol-value symbol [関数]

symbolの特殊値を得る。ローカル変数値は、この関数では取り出す ことはできない。


symbol-function symbol [関数]

symbolのグローバル関数定義を得る。 ローカル関数は、この関数で得られない。


symbol-package sym [関数]

symが収容されているパッケージを返す。


symbol-name sym [関数]

symのprint-nameを返す。 symbol-nameは、stringがコピーするのに反して、 pname文字列をコピーしない。 したがって、もしsymbol-nameで返された文字列を変えるならば symbolは普通の内部手続きを通してアクセス不可能となる。


symbol-plist sym [関数]

symのproperty-list(plist)を返す。 EusLispのplistは、関連リスト(association-list)と同じ様な書式を与える。 それは、属性名とその値の組を点でつないだ構成である。 これは、Common Lispの定義が要求するplist(属性名と値の線形リスト) と非互換である。 EusLispにおいて、plistはsymbolに独特なものではない。 propertied-objectを継承するクラスから派生したどんなオブジェクトも、 property-listを持つことができる。 propertied-objectの中のこれらのplistを設定したり、取りだしたりするために、 propertied-object-plistマクロは、symbol-plistの代りに 使用されるべきである。 しかしながら、getputpropはどのオブジェクトにも働く。


boundp symbol [関数]

symbolがグローバルな値を持っているかどうかを検査する。
注意:ローカル変数やオブジェクト変数として使用されるsymbolは いつも値を持っているため、boundpはこれらのローカル変数の 格納状態を検査することができない。


fboundp symbol [関数]

symbolがグローバルな関数定義を持っているかどうかを検査する。


makunbound symbol [関数]

symbolは、(特殊値を持たないように)強制的にunboundされる。 ローカル変数は、いつも値が割り当てられ、makunboundできない。


get sym attribute [関数]

symのplistの中でattributeに関連する値を取り出す。 (cdr (assoc attribute (symbol-plist sym)))と等価である。


putprop sym val attribute [関数]

putpropは、setfgetの組み合せで置き換えるべきである。


remprop sym attr [関数]

属性値(attr)とsymの組をproperty-listから削除する。


setq &rest forms [特殊]

forms中の各formにおいて、第二要素をsymbolか点で継った組である第一要素に割り当てる。 第一要素は、ローカル変数・オブジェクト変数・特殊変数の順番にその名前の中から探される。 ただし、明確にspecialと宣言されてないものに限る。


set sym val [関数]

valsymの特殊値として割り当てる。 setは、ローカル変数やオブジェクト変数に値を 割当てることはできない。


defun symbol lambda-list &rest body [特殊]

symbolにグローバル関数を定義する。 bodyの第一要素がstringであれば、documentationとして使用される。 ローカル関数を定義するためには、fletlabelsを使用すること。


defmacro symbol lambda-list &rest body [特殊]

グローバルマクロを定義する。 EusLispは、ローカルスコープマクロ定義の機能を持っていない。


defvar var &optional (init nil) doc [マクロ]

もしvarが特殊値を持っていれば、defvar は何もしない。 もしvarがunboundならば、specialとして宣言し、 initをその値として設定する。


defparameter var init &optional doc [マクロ]

defparameterは、varspecialとして宣言し、 varが既に値を持っていたとしても、initをその値として設定する。


defconstant sym val &optional doc [マクロ]

defconstantは、valsymの特殊値として設定する。 defvar, defparametersetqと違い、その値は defconstantでのみ設定され、これらの書式で変更することができない。 もし定数symbolの値が、変更されようとしたならば、 エラーが返される。 しかし、defconstantは以前の 定数値に上書きでき、上書きした場合は注意メッセージが出力される。


keywordp obj [関数]

もしobjがsymbolで、そのホームパッケージがKEYWORDのときTを返す。


constantp symbol [関数]

もしsymbolがdefconstantマクロで定数に宣言されているときTを返す。


documentation sym &optional type [関数]

symのために提示文字列(documentation string)を取り出す。


gensym &optional x [関数]

g001のような前置文字列と付属数字を組み合わせた新しい収容されていないsymbolを作る。 収容されてないsymbolは、symbolに関連するパッケージがないため、パッケージ前置詞 の部分に#:を示す。#:が前につくsymbolは、読めないsymbolで、 リーダではこれらのsymbolへの参照を作成することができない。 xは、整数か文字列が可能で、 接頭(prefix)インデックスか接尾(suffix)値として使用される。


gentemp &optional (prefix "T") (pkg *package*) [関数]

pkgに収容される新しいsymbolを作る。 ほとんどのアプリケーションにおいて、gensymgentempよりも好まれる。 なぜなら、収容されないsymbolの方が高速に作ることができ、 ガーベージコレクトも可能であるため。


パッケージ

パッケージは、symbolをグループ化するための区分された名前の付いた空間を与える。 複数のプログラマが要求されるような膨大なソフトウェアシステム を開発しようとするとき、symbol(関数および変数名)が重複する問題を減少させるために Common Lispでパッケージシステムが生まれた。 それぞれのパッケージは、内部symbolと外部symbolを持つ。 パッケージの中でsymbolが作成されたとき、いつでも内部symbolとなる。 exportを使用することにより外部symbolにすることができる。 異なったパッケージの外部symbolは、symbolの前にパッケージ名とコロン(:)を つけることにより参照することができる。例えば、x:*display*となる。 他のパッケージの内部symbolを参照する場合には、sys::free-threadsのように ダブルコロン(::)を使用する。 前にパッケージ名をつけることを省略するためには、importを用いる。 その上、use-packageを使用すれば、他のパッケージの全ての 外部symbolをimportすることができる。 symbolをexportあるいはimportするとき、あらゆるパッケージ内の 全てのsymbolが独自の print-nameを持つ必要があるため、symbol名の重複を発見することができる。 shadowは、パッケージからsymbolを仮想的に削除することにより、 存在するsymbolと同じ名前のsymbolを作成することができる。

Euslispは次の8つのパッケージを定義する。

lisp:
全てのlisp関数、マクロ、定数、など
keyword:
キーワードsymbol
unix:
UNIXシステムコールとライブラリ関数
system:
システム管理または危険な関数; nicknames=sys,si
compiler:
EusLispコンパイラ; nicknames=comp
user:
ユーザー領域
geometry:
幾何学クラスとその関数
xwindow:
X-windowインターフェース; nickname=x

これらのパッケージとユーザー定義パッケージは、システムの package-listに繋げられている。 それは、list-all-packagesよって得ることができる。 それぞれのパッケージは、内部および外部symbolを探索・位置付けするために2つの ハッシュテーブルを管理する。 また、パッケージは、その名前(stringまたはsymbol)とnick nameのリストと そのパッケージが使う他のパッケージリストを記憶している。 *package*は、読み込み・印刷のための主なパッケージを持つ グローバル変数である。 もし*package*user:でないならば、 top-levelプロンプトは、現在のパッケージを示すためにmypkg:eus$のように変更される。



*lisp-package* [定数]

Lispパッケージ。


*user-package* [定数]

ユーザーパッケージ。


*unix-package* [定数]

UNIXパッケージ。


*system-package* [定数]

システムパッケージ。


*keyword-package* [定数]

キーワードパッケージ。


find-symbol string &optional (package *package*) [関数]

packageのなかでprint-nameとしてstringをもつsymbolを 見つける。 もし見つかったとき、そのsymbolが返され、そうでないときNILが返される。


make-symbol string [関数]

stringで示される名前の新しい収容されていないsymbolを作る。


intern string &optional (package *package*) (klass symbol) [関数]

stringと同じprint-nameのsymbolを見つけようとする。 もし探索成功のとき、そのsymbolが返される。 もし失敗したとき、stringというprint-nameを持つsymbolが新しく作られ、 packageの中におかれる。


list-all-packages [関数]

今までに作られた全てのパッケージのリストを返す。


find-package name [関数]

パッケージの名前またはnicknameがnameと同じものを探す。


make-package name &key nicknames (use '(lisp)) [関数]

nameで示される名前の新しいパッケージを作る。 nameは、stringあるいはsymbolでよい。 もしパッケージが既に存在している場合、エラーが報告される。


in-package pkg &key nicknames (uses '(lisp)) [関数]

現在のパッケージ(*pacakge*の値)を pkgに変える。


package-name pkg [関数]

pkgパッケージの名前を文字列として返す。


package-nicknames pkg [関数]

pkgのnicknameのリストを返す。


rename-package pkg new-name &optional new-nicknames [関数]

pkgの名前をnew-nameに変更し、そのnicknameを new-nicknamesに変更する。 それらは、symbolかstringまたはsymbolかstringのリストのどれでも可能である。


package-use-list pkg [関数]

pkgで使用されるパッケージリストを返す。


packagep pkg [関数]

もしpkgがパッケージのときTを返す。


use-package pkg &optional (curpkg *package*) [関数]

pkgcurpkgのuse-listに付け加える。 一旦追加すると、pkgのなかのsymbolは、パッケージの前置詞なしで curpkgを見ることが可能になる。


unuse-package pkg &optional (curpkg *package*) [関数]

curpkgのuse-listからpkgを削除する。


shadow sym &optional(pkg *package*) [関数]

存在するsymを隠すことによって、 pkg内に内部symbolを作る。


export sym &optional (pkg *package*) [関数]

symは、symbolかsymbolのリストである。 exportは、symを他のパッケージから 外部symbolとしてアクセス可能とする。 実際に、symは、pkgのなかの外部symbolとして記録される。 もしsymbolがexportされると、パッケージマークとしてsingle colon ":"を使って アクセス可能となる。これに対して、exportされていないsymbolはdouble colon "::" で得られる。 そのうえ、exportされたsymbolは、 use-packageを使用したり、パッケージにimportされたとき、コロンの 必要がない。 symbolがexportされたかどうかは、それぞれのsymbolにでなくそれが収容されている パッケージに属性付けられる。 それで、symbolは1つのパッケージの内部にあり、その他の外部となる。 exportは、pkgが使用している他のパッケージの中の symbol名とsymが重複していないかどうかを検査する。 もしsymと同じprint nameをもつsymbolがあったならば、 "symbol conflict"とエラーを報告する。


unexport sym &optional pkg [関数]

もしsympkgの外部symbolであったならば、unexportされ、 内部symbolとなる。


import sym &optional (pkg *package*) [関数]

symは、symbolまたはsymbolのリストである。 importは、他のパッケージで定義されたsymbolを pkgからパッケージの前置詞なしで内部symbolとして見えるようにする。 もしsymと同じprint-nameを持ったsymbolが既にあったとき、 "name conflict"とエラーを報告する。


do-symbols (var pkg &optional result) &rest forms [マクロ]

pkgにおいて、(内部あるいは外部)symbolに対して繰り返しをする。 そのときのformsの評価が返される。


do-external-symbols (var pkg &optional result) &rest forms [マクロ]

pkgにおいて、外部symbolに対して繰り返しをする。 そのときのformsの評価が返される。


do-all-symbols (var &optional result) &rest forms [マクロ]

全てのパッケージにおいて、symbolに対して繰り返しをする。そのときのformsの評価が返される。 もし、1つ以上のパッケージの中にそのsymbolが現れたならば、formsは、 1度以上評価される。


This document was generated using the LaTeX2HTML translator on Sat Feb 5 14:36:44 JST 2022 from EusLisp version 138fb6ee Merge pull request #482 from k-okada/apply_dfsg_patch