最上位レベルの対話

EusLispの標準の最上位レベルの入力−評価−出力のループ(loop)は、eustop により制御されている。 euslispが呼び出されたとき、 eustopは、ホームディレクトリから".eusrc"というファイルを あるいはEUSRC環境変数で指定されたファイルをロードする。 それから、euslispは、引き数リストで指定されたファイルをロードする。 これらのロードが終了後、eustopは、普通の対話セッション(session)に入る。

*standard-input*にユーザーのTTYが接続されたとき、 eustopは、*prompt-string*(デフォルトとして"eus$"が 設定されている)に設定されたプロンプトを出力する。 そして、*terminal-io*ストリームから命令を入力する。 もし、その入力がカッコで括られた行ならば、 evalによってlisp書式として扱われる。 もし、入力行の最初のsymbolに関数定義があった場合、その行に自動的に カッコが入れられ、評価される。 もし、関数定義が見つからなかった場合、その特殊値(special value)が 調査され、その値が出力される。 もし、そのsymbolになにも定義されてないならば、 その行はUNIX命令とみなされ、sh(Bourn's shell)へ渡される。 もし、shが一致するUNIX命令を捜せなかったとき、 "command unrecognized"というメッセージを出力する。 このように、eustopはlispのインタープリタおよびUNIXのシェルとして動作する。 もし、入力をUNIX命令として実行したくないとき、 行の最初にコンマ','を付ければよい。 これは、対話実行(interpretive execution)でエラーが発生したとき、 動的な値を見るときに役に立つ。 Euslispはローカルなスコープ(lexical scope)を採用しているので ローカル変数の値をspecialとして宣言されていない限りスコープの外から 調査することは出来ない。

入力は、それぞれ行番号とともに*history*ベクトルに記憶される。 cshの上と同じ様に!関数を入力することにより入力の詳細を 呼び出すことができる。 cshの履歴との違いは、!が関数であるため!の次に最低1つの スペースが必要である。 また、コントロールキーを用いることによりemacsのように対話的に 行を編集することができる。

通常^D (EOF)でEuslispは終了する。 上位レベル(普通はcsh)に異常終了コードを返すためには、適当な条件コードをつけた exitを使用すること。

eustopは、SIGINTとSIGPIPEのためにシグナルハンドラーを設定する。 そして、他のシグナルはcatchしない。 このため、SIGTERMやSIGQUITのようなシグナルでEuslispを終了できる。 終了を避けたいとき、これらのシグナルをcatchするためには、 unix:signal関数でユーザーで定義したシグナルハンドラーを設定すること。



- [変数]

現在の入力


+ [変数]
直前の入力


++ [変数]
2つ前の入力


+++ [変数]
3つ前の入力


* [変数]
直前の結果


** [変数]
2つ前の結果


*** [変数]
3つ前の結果


*prompt-string* [変数]
eustopで使用されるプロンプト文字列


*program-name* [変数]
このEuslispが呼び出された命令。例えば、eus,eusx,eusxviewやユーザーで作った euslispなど。


eustop &rest argv [関数]

デフォルトの最上位ループ


eussig sig code [関数]

SIGPIPEのデフォルトシグナルハンドラー。 eussigは、SIGPIPEが到着したり他の最上位レベルループに入るとき シグナル番号を出力する。


sigint-handler sig code [関数]

SIGINT(control-C)のデフォルトシグナルハンドラー。 このシグナルで新しい最上位セッションへ入る。


euserror code message &rest arg [関数]

デフォルトのエラーハンドラーで、 messageを出力し、新しいエラーセッションへ入る。


reset [関数]

エラーループから脱出して、最後のeustopセッションへ戻る。


exit &optional termination-code [関数]

Euslispプロセスを終了し、プロセスの状態コードとしてtermination-code (0..255)を返す。


h [関数]

*history*の中に記憶されている入力履歴を 関連する列番号とともに出力する。


! &optional (seq 0) [関数]
列番号seqに関連する入力行を呼び出す。 seqが0のとき、もっとも最近の命令が呼び出される。 もし、seqが負の場合、現在行から相対的な位置にある行が 呼び出される。 呼び出された行が表示され、その行の最後にカーソルを移動する。 次のコントロールキーが使用出来る。 control-H (backspace)かcontrol-Bで1文字戻る。 control-Fかcontrol-Kで1文字進む。 control-Aで行の最初に移動する。 control-Lで行の最後に移動する。 control-Cで行の修正をキャンセルする。 control-M (carriage-return)かcontrol-J (line-feed)で 行修正を終了して、修正した行を評価する。 もし、seqが番号でなくsymbolまたは文字列の場合、 履歴リストを古い方に向かって検索し、 symbolまたは文字列が含まれている命令行を返す。


new-history depth [関数]
depthの長さを持つように*history*を初期化する。 depth行が記憶される。 現在の*history*に記録された入力行は、すべて消滅する。


2016-04-05