エラーやシグナル(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"の中に定義されている。
msg1とmsg2は、ユーザーに示されるメッセージである。
formは、エラーによって生じたs表現である。
シグナルハンドラーは、sigとcodeの2つの引き数を受ける関数として
定義されなければならない。
sigは、1から30までのシグナル番号である。
codeは、シグナル番号の中に定義された補助番号である。
最上位レベルでの^
D(end-of-file)は、Euslispの活動を停止させる。
これは、Euslispをフィルターとしてプログラムされているとき
役に立つ。
eval-dynamicは、letやlambda変数として使用されるsymbolに結び付く
動的な変数を捜す関数である。
デバッグするときに役に立つ。
identity obj [関数]
-
-
obj自身を返す。
idnetityとquoteとの違いに注意すること。
identityが関数であるのに対してquoteは、特殊書式(special form)
である。
したがって、(identity 'abc)はabcと評価されるが、
(quote 'abc) == (quote (quote abc))は'abcと評価される。
identityは、多くの一般列関数の:keyパラメータのデフォルト値
としてしばしば用いられる。
eval form [environment] [関数]
-
-
formを評価して、その値を返す。
もし、*evalhook*にformやenvironmentを受ける関数を
設定するならば、hook関数を評価に入る前に呼び出すことができる。
apply func &rest args [関数]
-
-
argsにfuncを適用する。
funcは、関数symbolかlambda書式かclosureでなければならない。
マクロと特殊書式(special form)は適用出来ない。
argsの最後の要素は、他のargsが空の引き数であるなら
引き数のリストでなければならない。
このように、もし、argsの最後がNILであったならば、
applyはほとんどfuncallと同じである。
ただし、applyはfuncallより1つ多くの引き数を持つことができる。
(apply #'max 2 5 3 '(8 2)) -> 8.
funcall func &rest args [関数]
-
-
argsにfuncを適用する。
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}* [特殊]
-
-
situationはcompile, load, evalのリストである。
formは、現在の実行モードがsituationと一致するときに評価される。
eval-whenは、コンパイラでの動作や環境を制御するために重要なものである。
もし、compileが指定されたならば、formはコンパイラによって
評価されるので、その結果はコンパイル結果に影響を及ぼすことになる。
例えば、defmacroはコンパイル時にマクロcallを展開するためにコンパイラで
評価されなければならない。
もし、loadがsituationのリストに与えられたならば、
formはload時にloadまたは評価されるためにコンパイルされる。
すなわち、load時にコンパイルされた関数が定義される。
これは、コンパイラに期待される一般的な機能である。
loadは、コンパイラの環境を制御するために使用される。
もし、evalがsituationのリストに含まれているならば、
formはソースコードがloadされるときに評価される。
the type form [特殊]
-
-
formをtypeとして宣言する。
typeは、:integer, :fixnum, :floatで示されるクラスオブジェクト
のどれかである。
declare declaration* [特殊]
-
-
それぞれdeclarationは、宣言指定や整数あるいは目的のsymbolのリストである。
宣言は、コンパイラが高速なコードを生成するために重要である。
- special 特殊変数を宣言する。
- type 変数の型を宣言する。; (type integer count);
有効な型指定子はinteger, :integer, fixnum,
:floatとfloatである。型指定子がここに示したものの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-stringとargsで与えられる警告メッセージを
*error-output*に出力する。
error format-string &rest args [関数]
-
-
*error-handler*に結び付く現在のエラーハンドラー関数を呼び出す。
デフォルトのエラーハンドラー'euserror'を*error-output*に最初に出力し
format-stringとargsをformatを用いて出力する。
その後、新しい最上位レベルのセッション(session)に入る。
プロンプトには、エラーセッションの深さを示す。
throwにその番号を与えることにより、低いエラーレベルのセッションへ戻ることができる。
マルチスレッドEuslispにおいて、特殊変数はスレッド間で共有され、
同じ*error-handler*が異なったスレッドから参照される。
この不自由を避けるために、マルチスレッドEuslispはinstall-error-handler
関数を備えている。その関数は、それぞれのスレッドに対して
異なったエラーハンドラーをインストールする。
install-error-handler handler [関数]
-
-
handlerを現在のスレッドのエラーハンドラーとしてインストールする。
2016-04-05