評価関数

エラーやシグナル(signal)に関する振る舞いを示すために、 あらかじめそれぞれ特別の変数*error-handler**signal-handler* に適当な関数を設定する。 修正あるいは続行できるエラーはない。 エラーを解析後、現在の実行をresetまたは上位レベルへの適当なthrow によって停止しなければならない。 Euslispの最上位レベルで0と名付けられたcatch frameを作成しているので、 resetは、(throw 0 NIL)と同等である。

エラーハンドラーは、code msg1 form &optional (msg2) という3つあるいは4つの引き数を持つ関数として定義しなければならない。 codeはエラーコードで、システムで定義されたエラーを示す。 例えば、14が'引き数が合わない'、13が'関数が定義されていない'となる。 これらの定義は、"c/eus.h"の中に定義されている。 msg1msg2は、ユーザーに示されるメッセージである。 formは、エラーによって生じたs表現である。

シグナルハンドラーは、sigcodeの2つの引き数を受ける関数として 定義されなければならない。 sigは、1から30までのシグナル番号である。 codeは、シグナル番号の中に定義された補助番号である。

最上位レベルでの^D(end-of-file)は、Euslispの活動を停止させる。 これは、Euslispをフィルターとしてプログラムされているとき 役に立つ。

eval-dynamicは、letやlambda変数として使用されるsymbolに結び付く 動的な変数を捜す関数である。 デバッグするときに役に立つ。



identity obj [関数]

obj自身を返す。 idnetityquoteとの違いに注意すること。 identityが関数であるのに対してquoteは、特殊書式(special form) である。 したがって、(identity 'abc)abcと評価されるが、 (quote 'abc) == (quote (quote abc))'abcと評価される。 identityは、多くの一般列関数の:keyパラメータのデフォルト値 としてしばしば用いられる。


eval form [environment] [関数]

formを評価して、その値を返す。 もし、*evalhook*formenvironmentを受ける関数を 設定するならば、hook関数を評価に入る前に呼び出すことができる。


apply func &rest args [関数]

argsfuncを適用する。 funcは、関数symbolかlambda書式かclosureでなければならない。 マクロと特殊書式(special form)は適用出来ない。 argsの最後の要素は、他のargsが空の引き数であるなら 引き数のリストでなければならない。 このように、もし、argsの最後がNILであったならば、 applyはほとんどfuncallと同じである。 ただし、applyfuncallより1つ多くの引き数を持つことができる。 (apply #'max 2 5 3 '(8 2)) -> 8.


funcall func &rest args [関数]

argsfuncを適用する。 argsの数は、funcで要求されている引き数の数と一致しなければ ならない。


quote obj [特殊]

obj自身を評価する。


function func [特殊]

closure関数を作る。 もし、funcがsymbolならば、その関数定義が検索される。


evalhook hookfunc form [env] [関数]

hookfun*evalhook*に結び付けた後、formを一度評価する。


eval-dynamic variable [関数]

スタックにあるvariable(symbol)の値を捜す。


macroexpand form [関数]

もし、formがマクロcallであるなら、それを展開する。 もし、展開したものがまだマクロcallを含んでいるならば、 マクロcallのない結果となるまでくり返し展開する。


eval-when situation {form}* [特殊]

situationcompile, load, evalのリストである。 formは、現在の実行モードがsituationと一致するときに評価される。 eval-whenは、コンパイラでの動作や環境を制御するために重要なものである。 もし、compileが指定されたならば、formはコンパイラによって 評価されるので、その結果はコンパイル結果に影響を及ぼすことになる。 例えば、defmacroはコンパイル時にマクロcallを展開するためにコンパイラで 評価されなければならない。 もし、loadsituationのリストに与えられたならば、 formはload時にloadまたは評価されるためにコンパイルされる。 すなわち、load時にコンパイルされた関数が定義される。 これは、コンパイラに期待される一般的な機能である。 loadは、コンパイラの環境を制御するために使用される。 もし、evalsituationのリストに含まれているならば、 formはソースコードがloadされるときに評価される。


the type form [特殊]

formtypeとして宣言する。 typeは、:integer, :fixnum, :floatで示されるクラスオブジェクト のどれかである。


declare declaration* [特殊]

それぞれdeclarationは、宣言指定や整数あるいは目的のsymbolのリストである。 宣言は、コンパイラが高速なコードを生成するために重要である。
special 特殊変数を宣言する。
type 変数の型を宣言する。; (type integer count); 有効な型指定子はinteger, :integer, fixnum, :floatfloatである。型指定子がここに示したものの1つである ならば、typeキーワードを削除しても良い。そのため、 (integer count)は正しい宣言である。 float-vector,integer-vectorなどのような、その他の型(クラス)では、 (type float-vector vec1)のようにtypeを前に付ける必要がある。
ftype 関数の結果の型を宣言する。
optimize コンパイラの*optimize*パラメータに値(0-3)を設定する。
safety コンパイラの*safety*パラメータに値(0-3)を設定する。
space コンパイラの*space*パラメータに値(0-3)を設定する。
inline 認識しない。
not-inline 認識しない。



proclaim proclamation [関数]
変数やコンパイラオプションをグローバルに宣言する。 同様な宣言は、declare特殊書式によって記述することができる。 しかしながら、proclaimは、1つの引数を持つ関数であり、 宣言を評価する。


warn format-string &rest args [関数]

format-stringargsで与えられる警告メッセージを *error-output*に出力する。


error format-string &rest args [関数]
*error-handler*に結び付く現在のエラーハンドラー関数を呼び出す。 デフォルトのエラーハンドラー'euserror'を*error-output*に最初に出力し format-stringargsformatを用いて出力する。 その後、新しい最上位レベルのセッション(session)に入る。 プロンプトには、エラーセッションの深さを示す。 throwにその番号を与えることにより、低いエラーレベルのセッションへ戻ることができる。


マルチスレッドEuslispにおいて、特殊変数はスレッド間で共有され、 同じ*error-handler*が異なったスレッドから参照される。 この不自由を避けるために、マルチスレッドEuslispはinstall-error-handler 関数を備えている。その関数は、それぞれのスレッドに対して 異なったエラーハンドラーをインストールする。



install-error-handler handler [関数]

handlerを現在のスレッドのエラーハンドラーとしてインストールする。


2016-04-05