pi [file] [arguments]
引数なしで起動した場合、pi は通常の read-eval-print ループを実行する。
式 (exit)
を評価することで終了する。
起動時に引数を与えた場合、それが "--" でなければ第一引数をファイル名
として解釈し、read-eval-print ループの実行に先だってそのファイルを
ロードする。
第二引数以降はアプリケーションにパラメータを与えるために利用できる。
プログラムからコマンドラインの引数を知るには大域変数
*invocation-arg*
または手続き
rp:command-line-arguments
を使用する。
pi に引数を与えるがファイルのロードは行わない場合は第一引数として "--"
を指定する。pi が引数なし、あるいは "--" を第一引数として起動された場合、
環境変数 RHIZOME_PI_RC がセットされていればその内容が read-eval-print
ループの実行に先だって評価される。
pi の動作は標準ライブラリに含まれるモジュール rp_pi が行なっている。pisl
の最後の引数として rp_pi: を指定することで他のモジュールに含まれる手続きが
コンパイル済みで追加されたインタプリタを作成できる。特にコマンド
"pisl rp_pi:" を実行することで pi そのものと同じ実行プログラムが作られる。
モジュール rp_pi の動作の詳細は以下のとおりである。
*invocation-arg*
にはコマンドラインがセットされている。
*invocation-arg*
から取り除く。
それ以外の第一引数が指定されていれば第ゼロ引数(コマンド名)を
*invocation-arg*
から取り除く。
引数がなければ *invocation-arg*
はそのままにしておく。
*invocation-arg*
の car から取って呼ばれる。この動作自体はモジュール rp_pi
が行なうものではなく、モジュール rp_pi
がリンクされているかどうかにかかわらず常に行なわれる。
*invocation-arg*
大域変数
(rp:command-line-arguments)
手続き
例
$ cat arg.scm (display "*invocation-arg* is ") (write *invocation-arg*) (newline) (display "rp:command-line-arguments returns ") (write (rp:command-line-arguments)) (newline) (exit) $ pi arg.scm foo bar baz *invocation-arg* is ("arg.scm" "foo" "bar" "baz") rp:command-line-arguments returns #("pi" "arg.scm" "foo" "bar" "baz") $ pisc arg.scm $ pisl arg gcc -O2 -m486 -I/u/qfwfq/lib/rhizome -c arg.c gcc -O2 -m486 -I/u/qfwfq/lib/rhizome -c a.c gcc -L/u/qfwfq/lib/rhizome a.o arg.o -lrhzscm -lrhzpi -lrhizome -lm $ ./a.out foo bar baz *invocation-arg* is ("./a.out" "foo" "bar" "baz") rp:command-line-arguments returns #("./a.out" "foo" "bar" "baz")
pisc -help
pisc [options] file
file
をC言語のプログラムに変換する。
オプション:
-module module-identifier
module-identifier
とする。
モジュール名は pisl で実行ファイルを生成する時に指定する名前である。
これはC言語の識別子として正当なものでなければならない。
デフォルトではソースファイルの名前から末尾の ".scm" を
(もしあれば)除いたものとなる。
-output filename
-mpath dir
dir
を rp:use-macro-package
のサーチパスに加える。このオプションは複数指定できる。
-load filename
pisf -help
pisf [options] file
file
を変換する。
オプション:
-exec interpreter
interpreter
にはプログラムを実行すべき実行ファイルのフルパスを指定する。
出力されるファイルの一行目は "#!interpreter
"
の形になる。
-module module-identifier
module-identifier
は pisc
で指定するのと同様の意味を持ち、生成されたファイルは
pisc の出力と同様に pisl にモジュールとして指定する。
-output filename
-mpath dir
-load filename
pisl -help
pisl [options] module-specifier ...
module-specifier
で指定されるモジュールを
結合して実行ファイルを生成する。
オプション:
-cc cc-command-line
pisl -help
の出力で知ることができる。
-ld ld-command-line
pisl -help
の出力で知ることができる。
-nold
-nolib
pisl -help
の出力で知る
ことができる。
-loadable
rp:load-compiled-module
手続きによりロードする。
環境によってはこのオプションは使用できない。
-static
-modlib
-windows
-o filename
-s filename
-base address
-xm module
module
で指定された標準モジュールを
実行ファイルから除く。module
は次のうちのどれか。
expand |
syntax-case によるhygienicマクロ機能。これが除かれると 一部の構文の振る舞いがわずかに変化するが、その変化は 普通のプログラムに影響を及ぼすようなものではない。 | |
stdmacro |
標準のマクロ。rhizome/pi では define, lambda など 基本的な構文キーワードもマクロなのでこれが除かれると 使用できなくなる。アプリケーションが実行時に任意の 式を評価する機能を持たないならこれを除いても安全 である。 | |
debugger |
デバッグ機能。 | |
stdproc |
組み込み手続きのうち rhizome/pi において scheme で
記述されているもの。これを除いた場合何が使用できなく
なるかはソースを参照のこと :-)
これを除くと expand と debugger
も自動的に除かれる。 |
|
extcall |
共有オブジェクト内の関数へのインターフェースを提供するマクロ。 アプリケーションの実行時に新たに外部手続き、コールバック、 バッファ構造、定数を定義する必要がなければ これを除いても安全である。 | |
saccess |
extcall に含まれるマクロによって定義されたマクロを
展開するときに使用される手続き。expand が除かれると
saccess も自動的に除かれる。またsaccess
が除かれるとextcall が自動的に除かれる。 |
-aux string
string
をリンカのコマンドラインに追加する。
すでにオブジェクトファイルになっているモジュールを指定する目的に使用
できる。module-specifier
の指定方法
module-specifier
には pisc の -module
オプションで指定した名前を指定する。
そのモジュールが含まれるファイルがモジュール名に ".c" を追加した名前で
ない場合、ファイル名を ':' のあとに指定する。また、ファイルが既に
オブジェクトファイルになっている場合は ':' のあとを空文字列にし、
オブジェクトファイルの名前を -aux オプションを使用して指定する。
例
ソースファイル x.scm, y.scm, z-0.scm をコンパイルして実行ファイルを
作成するとする。以下はコンパイルの手順の一例である。
pisc x.scm # x.c を生成 pisl -nold x # x.o を生成 pisc y.scm # y.c を生成 pisc -module zz -output z-0.c z-0.scm # z-0.c を生成、モジュール名は zz pisl -aux x.o x: y zz:z-0.c # 実行ファイルを生成生成された実行ファイルを起動すると各ソースファイルをインタプリタ上で pisl に与えたモジュール指定の順にロードした場合と同様の動作をする。 上の例では、a.scm の内容が
(load "x.scm") (load "y.scm") (load "z-0.scm")であったとして
pi a.scm [arguments]とした場合と同様の動作となる。
(exit)
するようになっていれば、生成されるものは非対話的なプログラムになる。また、
一連の手続きの定義のみを含むプログラムをコンパイルすれば生成されるものは
その手続きがあらかじめ定義された scheme インタプリタとなる。ただしこの
場合起動時の第一引数をロードするといった pi と同じ動作を望むなら、その
動作をプログラムに記述しなければならない(ライブラリに含まれるモジュール rp_pi
をリンクすればよい。pi 自身は "pisl -o pi rp_pi:
"
として作成できる。)