その他
===

ctrl
----

ctrl("SWITCH"[,OBJ])
     :: 環境設定

return
     設定されている値

switch
     スイッチ名

obj
     パラメタ

  * Asir の実行環境の設定変更, 参照を行う.

  * SWITCH のみの場合, そのスイッチの現在の状態を返す.

  * OBJ が与えられているとき, その値を設定する.

  * スイッチは文字列として入力する. すなわちダブルクォートで囲む.

  * スイッチは次の通り.

     cputime
          on の時 CPU time および GC time を表示, off の時 表示しない. cputime() を参照. ctrl("cputime",ONOFF) は cputime(ONOFF) と同じである.

     nez
          EZGCD のアルゴリズムの切替え. デフォルトで 1 であり, とくに切替える必要はない.

     echo
          on の時は標準入力を繰り返して出力し, off の時は標準入力を繰り返さない. output コマンドを用いる際に有効である.

     bigfloat
          on の時, 入力された浮動小数は bigfloat に変換され, 浮動小数演算は PARI (see pari) により行われる. デフォルトの有効桁数は 9 桁である. 有効桁数を増やしたい時には setprec() を用いる. off の時, 入力された浮動小数は, 倍精度浮動小数に変換される.

     adj
          ガーベッジコレクションの頻度の変更. 1 以上の有理数が指定できる. デフォルト値は 3. 1 に近い程, ガーベッジコレクションせずにヒープを大きくとるようになる. 整数値はコマンドラインで指定できる. See コマンドラインオプション.

     verbose
          on の時, 函数の再定義時にメッセージを表示する.

     hex
          1 のとき, 整数は 0x で始まる 16 進数として表示される. -1 のとき, 16 進数は, 間に | をはさんで 8 桁ごとに区切って表示される.

     ox_batch
          1 のとき, 送信バッファがいっぱいになった時のみ自動的に flush. 0 のとき, データ, コマンド送信毎に flush. (デフォルト値は 0.) See 分散計算

     ox_check
          1 のとき, 送信データを相手プロセスが受け取れるかどうかチェックする. 0 のときしない. (デフォルト値は 1.) See 分散計算

参照
     cputime tstart tstop, output, pari, setprec, eval.

debug
-----

debug
     :: デバッグモードに入る.

  * debug は無引数の函数であるが, () なしで呼び出せる.

  * デバッグモードに入るとプロンプトが (debug) となり, コマンド受け付け状態となる. quit を入力するとデバッガから抜ける.

  * デバッグモードについての詳細は see デバッガ.

     [1] debug;
     (debug) quit
     0
     [2]

error
-----

error(MESSAGE)
     :: プログラム中で強制的にエラーを発生させる.

message
     文字列

  * 一般に, 引数の間違いなど, 続行不可能なエラーが組み込み函数において発生した時, トップレベルに戻る前に, 可能ならばそのエラーの時点でデバッグモードに入る. error() は, ユーザ函数の内部でこの動作と同様の動作を行わせるための函数である.

  * 引数は, error() が呼び出される際に表示されるメッセージで, 文字列である.

  * ユーザ函数において, 変数をチェックして, あり得ない値の場合に error() を呼び出すようにしておけば, その時点で自動的にデバッグモードに入れる.

     % cat mod3
     def mod3(A) {
             if ( type(A) >= 2 )
                     error("invalid argument");
             else
                     return A % 3;
     }
     end$
     % asir
     [0] load("mod3");
     1
     [3] mod3(5);
     2
     [4] mod3(x);
     invalid argument
     stopped in mod3 at line 3 in file "./mod3"
     3                       error("invalid argument");
     (debug) print A
     A = x
     (debug) quit
     return to toplevel
     [4]

参照
     debug.

help
----

help(["FUNCTION"])
     :: 函数の説明を表示する.

return
     0

function
     函数名

  * 無引数の時, 最小限の説明が表示される. 函数名が引数として与えられたとき, 標準ライブラリディレクトリにある help というディレクトリに同名のファイルがあれば, 環境変数 PAGER に設定されているコマンド, あるいは more を呼び出してそのファイルを表示する.

  * Windows 版では, コマンドラインからのヘルプ呼び出しは未サポートだが, メニューから HTML 形式のものを呼び出し用いることができる.

time
----

time()
     :: セッション開始から現在までの CPU 時間および GC 時間を表示する

return
     リスト

  * CPU 時間および GC 時間の表示に関するコマンドである.

  * GC 時間とは, ガーベジコレクタにより消費されたと見なされる時間, CPU 時間は, 全体の CPU 時間から GC 時間を引いた残りで, 単位は秒である.

  * time() は引数なしで, セッション開始から現在までの CPU 時間, GC 時間, 現在までに要求されたメモリののべ容量, およびセッション開始から現在までの経過時間の表示をする. すなわち, [CPU 時間 (秒), GC 時間 (秒), メモリ量 (ワード), 経過時間 (秒)] なるリストを返す. 1 ワードは通常 4 バイトである.

  * 計算の実行開始時, 終了時の time() から, その計算に対する CPU 時間, GC 時間がわかる.

  * メモリ量は多倍長数ではないため, ある値を越えると無意味な値となるためあくまでも目安として用いるべきである.

  * ctrl() や cputime() により cputime スイッチが on になっている場合には, トップレベルの文を一つの単位として, その実行時間が表示される. しかし, プログラムの内部などで, 特定の計算に対する計算時間を知りたい時には, time() などを使う必要がある.

  * getrusage() が使える UNIX 上では time() は信頼性のある値を返すが, Windows 95, 98 上では時刻を用いるほか方法がないため経過時間そのものが表示される. よって, 待ち状態があると, それも経過時間に加算される.

     [72] T0=time();
     [2.390885,0.484358,46560,9.157768]
     [73] G=hgr(katsura(4),[u4,u3,u2,u1,u0],2)$
     [74] T1=time();
     [8.968048,7.705907,1514833,63.359717]
     [75] ["CPU",T1[0]-T0[0],"GC",T1[1]-T0[1]];
     [CPU,6.577163,GC,7.221549]

参照
     cputime tstart tstop.

cputime, tstart, tstop
----------------------

cputime(ONOFF)
     :: 引数が 0 ならば cputime の表示を止める. それ以外ならば表示を行う.

tstart()
     :: CPU time 計測開始.

tstop()
     :: CPU time 計測終了および表示.

return
     0

onoff
     フラグ (任意)

  * cputime() は, 引数が 0 ならば CPU time の表示を止める. それ以外ならば表示を行う.

  * tsart は引数なし, () なしで, CPU time 計測を開始する.

  * tstop は引数なし, () なしで, CPU time 計測を終了, および表示する.

  * cputime(ONOFF) は ctrl("cputime",ONOFF) と同じである.

  * tstart, tstop は, 入れ子にして使われることは想定していないため, そのような可能性がある場合には, time() による計測を行う必要がある.

  * cputime() による on, off は, 単に表示の on, off であり, トップレベルの一つの文に対する計測は常に行われている. よって, 計算を始めてからでも, 計算終了前にデバッガに入って cputime(1) を実行させれば計算時間は表示される.

     [49] tstart$
     [50] fctr(x^10-y^10);
     [[1,1],[x+y,1],[x^4-y*x^3+y^2*x^2-y^3*x+y^4,1],[x-y,1],
     [x^4+y*x^3+y^2*x^2+y^3*x+y^4,1]]
     [51] tstop$
     80msec + gc : 40msec

参照
     time, ctrl.

heap
----

heap()
     :: 現在のヒープの大きさを返す. (単位:バイト)

return
     自然数

  * 現在のヒープの大きさ(単位 : バイト) を返す. ヒープとは, Asir のさまざまな数式や, ユーザプログラムなどがおかれるメモリの領域で, ガーベジコレクタにより管理されている. プログラムの動作中は, ヒープの大きさは単調非減少であり, 実メモリの量をこえて大きくなった場合には, OS によるスワップエリアへの読み書きがほとんどの計算時間を占めることになる.

  * 実メモリが少ない場合には, 起動時の -adj オプションにより, GC 主体の設定を行っておく必要がある.

     % asir -adj 16
     [0] load("fctrdata")$
     0
     [97] cputime(1)$
     0msec
     [98] heap();
     524288
     0msec
     [99] fctr(Wang[8])$
     3.190sec + gc : 3.420sec
     [100] heap();
     1118208
     0msec
     [101] quit;
     % asir
     [0] load("fctrdata")$
     0
     [97] cputime(1)$
     0msec
     [98] heap();
     827392
     0msec
     [99] fctr(Wang[8])$
     3.000sec + gc : 1.180sec
     [100] heap();
     1626112
     0msec
     [101] quit;

参照
     コマンドラインオプション.

version
-------

version()
     :: Asir のバージョンを返す.

return
     自然数

  * Asir のバージョンを 10 進 6 桁の自然数で返す. 最初の 2 桁が西暦の下 2 桁, 次の 2 桁が月, 最後の 2 桁が日を表す.

     [0] version();
     990831

shell
-----

shell(COMMAND)
     :: COMMAND をシェルコマンドとして実行する.

return
     自然数

command
     文字列

  * COMMAND を C の system() 函数によりシェルコマンドとして実行する. シェルの終了ステータスを返す.

     [0] shell("ls");
     alg             da              katsura         ralg            suit
     algt            defs.h          kimura          ratint          test
     alpi            edet            kimura3         robot           texput.log
     asir.o          fee             mfee            sasa            wang
     asir_symtab     gr              mksym           shira           wang_data
     base            gr.h            mp              snf1            wt
     bgk             help            msubst          solve
     chou            hom             p               sp
     const           ifplot          proot           strum
     cyclic          is              r               sugar
     0
     [1]

map
---

map(FUNCTION,ARG0,ARG1,...)
     :: リスト, 配列の各要素に函数を適用する.

return
     ARG0 と同じ型のオブジェクト

function
     函数名

arg0
     リスト, ベクトル, 行列

arg1, ...
     任意 (残りの引数)

  * ARG0 の各要素を最初の引数, ARG1 以下の残りの引数として函数 FUNCTION を呼び出し, ARG0 の対応する要素の位置に函数呼び出しの結果が入った同じ型のオブジェクトを生成して返す.

  * FUNCTION は, ダブルクォートのない函数名を用いる.

  * FUNCTION にプログラム変数は使えない.

  * ARG0 がリスト, ベクトル, 行列以外の場合, 単に ARG0, ARG1, ... を引数として FUNCTION を呼び出しその結果を返す.

     [82] def afo(X) { return X^3; }
     [83] map(afo,[1,2,3]);
     [1,8,27]

flist
-----

flist()
     :: 現在定義されている函数名を文字列リストとして返す.

return
     文字列のリスト

  * 現在定義されている組み込み函数, ユーザ定義函数の函数名を文字列リストとして返す.

  * システム函数の後にユーザ定義函数が続く.

     [77] flist();
     [defpoly,newalg,mainalg,algtorat,rattoalg,getalg,alg,algv,...]

delete_history
--------------

delete_history([INDEX])
     :: ヒストリを消去する.

return
     0

index
     消去したいヒストリの番号

  * 引数がないとき, これまで計算したヒストリを全て消去する.

  * 引数があるとき, その番号の結果のみ消去する.

  * ここでヒストリとは, 番号つきのプロンプトに対しての入力を評価して得られた式で, この式は @NUMBER により取り出すことができる. このことは, ガーベッジコレクションの際にもこの式が生き残ることを意味する.

  * 大きな式がヒストリとして残った場合, 以降のメモリ管理に支障を来す場合が多いため, bsave() などでファイルにセーブして, delete_history() によりヒストリを消去しておくのが有効である.

     [0] (x+y+z)^100$
     [1] @0;
     ...
     [2] delete_history(0);
     [3] @0;
     0

get_rootdir
-----------

get_rootdir()
     :: Asir のルートディレクトリ名を取り出す

return
     文字列

  * UNIX 版の場合, 環境変数 ASIR_LIBDIR が定義されている場合にはその値, されていない場合には /usr/local/lib/asir を返す.

  * Windows 版の場合, asirgui.exe のあるディレクトリ (bin という名前のはずである) の親ディレクトリが返される.

  * この関数が返すディレクトリ名を基準とした相対パス名を指定することにより, インストールされた場所によらないファイル読み込みプログラムを書くことができる.

getopt
------

getopt(KEY)
     :: オプションの値を返す.

return
     任意

  * ユーザ定義関数は, 固定個数引数でしか宣言できない. ユーザ定義関数で可変個引数を実現する方法の一つとして, オプションによる引数の指定がある (see オプション指定). 指定されたオプションを関数内で受け取るためにこの関数を用いる.

  * 関数呼び出しの際に KEY がオプションとして指定されている場合には, その値を返す. もし指定がない場合には, VOID 型オブジェクト (型識別子 -1) を返す. getopt() が返した値の型を type() で調べることで, そのオプションが指定されたかどうか調べることができる.

  * 関数呼び出しにおけるオプションの指定は, 正規の引数ならびの後ろに,

          xxx(A,B,C,D|x=X,y=Y,z=Z)

     という風に, | に続く, KEY=VALUE の , で区切られた並びを置くことで行う.

参照
     オプション指定, type.