入出力
===

Inputs and Outputs
==================

end, quit
---------

end, quit

     :: 現在読み込み中のファイルを閉じる. トップレベルにおいてはセッションを終了することになる.

     :: Close the currently reading file. At the top level, terminate the Asir session.

  * end, quit ともに無引数の函数であるが, () なしで呼び出すことができる. いずれも現在読み込み中のファイルを閉じる. これは, トップレベルにおいてはセッションを終了させることになる.

  * ファイルの場合, ファイルの終端まで読めば, 自動的にファイルは閉じられるが, トップレベルの場合プロンプトが出ないまま, 入力待ちになるので, ファイルの終端には end$ を書くのが望ましい.

  * These two functions take no arguments.  These functions can be called without a ().  Either function close the current input file. This means the termination of the Asir session at the top level.

  * An input file will be automatically closed if it is read to its end. However, if no end$ is written at the last of the input file, the control will be returned to the top level and Asir will be waiting for an input without any prompting. Thus, in order to avoid confusion, putting a end$ at the last line of the input file is strongly recommended.

     [6] quit;
     %

参照

References
     load.

load
----

load("FILENAME")
     :: FILENAME を読み込む.

     :: Reads a program file FILENAME.

return
     (1|0)

filename
     ファイル名 (パス名)

     file (path) name

  * 実際のプログラムの書き方は, see ユーザ言語 Asir. テキストファイルを読み込む場合, cpp を通すので, C のプログラム同様 #include, #define を使うことができる.

  * 指定したファイルが存在した時には 1 を返し, 存在しなかった時は 0 を返す.

  * ファイル名が / で始まる場合は絶対パス, . で始まる場合はカレントディレクトリからの相対パスと見なされる. それ以外の場合, 環境変数 ASIRLOADPATH に設定されているディレクトリを左から順にサーチする. それらに該当するファイルが存在しない場合, 標準ライブラリディレクトリ (あるいは環境変数 ASIR_LIBDIR に設定されているディレクトリ) もサーチする. Windows 版の場合, ASIR_LIBDIR が設定されていない場合には, get_rootdir()/lib をサーチする.

  * 読み込むファイルの最後に, end$ がないと load() 終了後にプロンプトがでないが, 実際には入力を受け付ける. しかし, 混乱を招くおそれがあるのでファイルの最後に end$ を書いておくことが望ましい. (end; でもよいが, end が返す値 0 が表示されるため, end$ をお勧めする. )

  * Windows 版もディレクトリのセパレータとして / を用いる.

  * See User language Asir for practical programming. Since text files are read through cpp, the user can use, as in C programs, #include and #define in Asir program source codes.

  * It returns 1 if the designated file exists, 0 otherwise.

  * If the FILENAME begins with /, it is understood as an absolute path name; with  ., relative path name from current directory; otherwise, the file is searched first from directories assigned to an environmental variable ASIRLOADPATH, then if the search ends up in failure, the standard library directory (or directories assigned to ASIR_LIBDIR) shall be searched. On Windows, get_rootdir()/lib is searched if ASIR_LIBDIR is not set.

  * We recommend to write an end command at the last line of your program.  If not, Asir will not give you a prompt after it will have executed load command. (Escape with an interrupt character (Interruption), if you have lost yourself.) Even in such a situation, Asir itself is still ready to read keyboard inputs as usual. It is, however, embarrassing and may cause other errors. Therefore, to put an end$ at the last line is desirable. (Command end; will work as well, but it also returns and displays verbose.)

  * On Windows one has to use / as the separator of directory names.

参照

References
     end quit, which, get_rootdir.

which
-----

which("FILENAME")
     :: 引数 FILENAME に対し, load() が読み込むパス名を返す.

     :: This returns the path name for the FILENAME which load() will read.

return
     パス名

     path name

filename
     ファイル名 (パス名) または 0

     filename (path name) or 0

  * load() がファイルをサーチする手順に従ってサーチし, ファイルが存在する場合にはパス名を文字列として, 存在しない場合には 0 を返す.

  * サーチの手順については load() を参照.

  * Windows 版もディレクトリのセパレータとして / を用いる.

  * This function searches directory trees according to the same procedure as load() will do.  Then, returns a string, the path name to the file if the named file exists; 0 unless otherwise.

  * For details of searching procedure, refer to the description about load().

  * On Windows one has to use / as the separator of directory names.

     [0] which("gr");
     ./gb/gr
     [1] which("/usr/local/lib/gr");
     0
     [2] which("/usr/local/lib/asir/gr");
     /usr/local/lib/asir/gr

参照

References
     load.

output
------

output(["FILENAME"])
     :: 以降の出力先を FILENAMEまたは標準出力に切替える.

     :: Writes the return values and prompt onto file FILENAME.

return
     1

filename
     ファイル名

     filename

  * Asir の出力を標準出力から, ファイルへの出力に切替える. なお, ファイル出力の間は, 標準出力にはキーボードからの入力以外, 出力されない.

  * 別のファイル出力に切替える時には, 再び output("FILENAME") を実行する. 又, ファイル出力を終了し標準出力に戻りたい時には, 引数なしで output() を実行する.

  * 指定したファイル FILENAME が存在した時は, そのファイルの末尾に追書きされ, 存在しなかった時には, 新たにファイルを作成し, そこに書き込まれる.

  * ファイルネームを "" ダブルクォートなしで指定をしたり, ユーザが, 書き込めないファイルを指定したりすると, エラーによりトップレベルに戻る.

  * 入力したものも込めてファイルに出力したい場合には, ctrl("echo",1) を実行した後でファイル出力に切替えれば良い.

  * 計算時間など, 標準エラー出力に書き出されるものはファイルには書き出されない.

  * 函数形式, 未定係数 (vtype() 参照) を含まない数式のファイルへの読み書きは, bload(), bsave() を使うのが, 時間, 空間ともに効率がよい.

  * Windows 版もディレクトリのセパレータとして / を用いる.

  * Standard output stream of Asir is redirected to the specified file. While Asir is writing its outputs onto a file, no outputs, except for keyboard inputs and some of error messages, are written onto the standard output. (You cannot see the result on the display.)

  * To direct the Asir outputs to the standard output, issue the command without argument, i.e., output().

  * If the specified file already exists, new outputs will be added to the tail of the file. If not, a file is newly created and the outputs will be written onto the file.

  * When file name is specified without double quotes (""), or when protected file is specified, an error occurs and the system returns to the top level.

  * If you want to write inputs from the key board onto the file as well as Asir outputs, put command ctrl("echo",1), and then redirect the standard output to your desired file.

  * Contents which are written onto the standard error output, CPU time etc., are not written onto the file.

  * Reading and writing algebraic expressions which contain neither functional forms nor unknown coefficients (vtype() References) are performed more efficiently, with respect to both time and space, by bload() and  bsave().

  * On Windows one has to use / as the separator of directory names.

     [83] output("afo");
     fctr(x^2-y^2);
     print("afo");
     output();
     1
     [87] quit;
     % cat afo
     1
     [84] [[1,1],[x+y,1],[x-y,1]]
     [85] afo
     0
     [86]

参照

References
     ctrl, bsave bload.

bsave, bload
------------

bsave(OBJ,"FILENAME")
     :: FILENAME に OBJ をバイナリ形式で書き込む.

     :: This function writes OBJ onto FILENAME in binary form.

bload("FILENAME")
     :: FILENAME から数式をバイナリ形式で読み込む.

     :: This function reads an expression from FILENAME in binary form.

return
     bsave() : 1, bload() : 読み込んだ数式

     bsave() : 1, bload() : the expression read

obj
     函数形式, 未定係数を含まない任意の数式

     arbitrary expression which does not contain neither function forms nor unknown coefficients.

filename
     ファイル名

     filename

  * bsave() は内部形式をほぼそのままバイナリ形式でファイルに書き込む. bload() は, bsave() で書き込んだ数式を読み込んで内部形式に変換する. 現在のインプリメンテーションの制限により, 函数形式, 未定係数 (vtype() 参照) を含まないリスト, 配列などを含む任意の数式をファイルに保存することができる.

  * output() などで保存した場合, 読み込み時にパーザが起動されるが, bsave() で保存したものを bload() で読む場合, 直接内部形式が構成できるため, 時間的, 空間的に効率がよい.

  * 多項式の場合, 書き込み時と読み込み時で変数順序が異なる場合があるが, その場合には, 自動的に現在の変数順序における内部形式に変換される.

  * Windows 版もディレクトリのセパレータとして / を用いる.

  * Function bsave() writes an object onto a file in its internal form (not exact internal form but very similar). Function bload() read the expression from files which is written by bsave(). Current implementation support arbitrary expressions, including lists, arrays (i.e., vectors and matrices), except for function forms and unknown coefficients (vtype() References.)

  * The parser is activated to retrieve expressions written by output() , whereas internal forms are directly reconstructed by bload() from the bsave()'ed object in the file. The latter is much more efficient with respect to both time and space.

  * It may happen that the variable ordering at reading is changed from that at writing.  In such a case, the variable ordering in the internal expression is automatically rearranged according to the current variable ordering.

  * On Windows one has to use / as the separator of directory names.

     [0] A=(x+y+z+u+v+w)^20$
     [1] bsave(A,"afo");
     1
     [2] B = bload("afo")$
     [3] A == B;
     1
     [4] X=(x+y)^2;
     x^2+2*y*x+y^2
     [5] bsave(X,"afo")$
     [6] quit;
     % asir
     [0] ord([y,x])$
     [1] bload("afo");
     y^2+2*x*y+x^2

参照

References
     output.

bload27
-------

bload27("FILENAME")
     :: 旧版で作られた bsave file の読み込み

     :: Reads bsaved file created by older version of Asir.

return
     読み込んだ数式

     expression read

filename
     ファイル名

     filename

  * 旧版では, 多倍長整数が, 1 ワード 27 bit で表現されていたが, 新版では 1 ワード 32 bit に変更された. このため, 旧版で bsave されたバイナリファイルはそのままでは読み込めない. このようなファイルを読み込むために bload27 を用いる.

  * Windows 版もディレクトリのセパレータとして / を用いる.

  * In older versions an arbitrary precision integer is represented as an array of 27bit integers. In the current version it is represented as an array of 32bit integers. By this incompatibility the bsaved file created by older versions cannot be read in the current version by bload. bload27 is used to read such files.

  * On Windows one has to use / as the separator of directory names.

参照

References
     bsave bload.

print
-----

print(OBJ [,NL])
     :: OBJ を表示する.

     :: Displays (or outputs) OBJ.

return
     0

obj
     任意

     arbitrary

nl
     フラグ (任意)

     flag (arbitrary)

  * OBJ を評価して表示する.

  * 第 2 引数がないか, または 0, 2 以外の場合, 改行する. 第 2 引数が 1 の場合, 改行せず, 出力はバッファに書き込まれ, バッファはフラッシュされない. 第 2 引数が 2 の場合, 改行しないがバッファはフラッシュされる.

  * この函数の戻り値は 0 であるから, print(); で実行すると, 出力の後に 0 が返される. print()$ とすれば, 最後の 0 は出力されない.

  * 複数の OBJ を同時に出力したい時は OBJ をリストにするとよい.

  * Displays (or outputs) OBJ.

  * It normally adds linefeed code to cause the cursor moving to the next line.  If 0 or 2 is given as the second argument, it does not add a linefeed. If the second argument is 0, the output is simply written in the buffer. If the second argument is 2, the output is flushed.

  * The return value of this function is 0. If command print(RAT); is performed at the top level, first the value of RAT will be printed, followed by a linefeed, followed by a 0 which is the value of the function and followed by a linefeed and the next prompt. (If the command is terminated by a `$', e.g., print(RAT)$, The last 0 will not be printed. )

  * Formatted outputs are not currently supported. If one wishes to output multiple objects by a single print() command, use list like [OBJ1,...], which is not so beautiful, but convenient to minimize programming efforts.

     [8] def cat(L) { while ( L != [] ) { print(car(L),0); L = cdr(L);}
     print(""); }
     [9] cat([xyz,123,"gahaha"])$
     xyz123gahaha

open_file, close_file, get_line, get_byte, put_byte, purge_stdin
----------------------------------------------------------------

open_file("FILENAME"[,"MODE"])
     :: FILENAME をオープンする.

     :: Opens FILENAME for reading.

close_file(NUM)
     :: 識別子 NUM のファイルをクローズする.

     :: Closes the file indicated by a descriptor NUM.

get_line([NUM])
     :: 識別子 NUM のファイルから 1 行読む.

     :: Reads a line from the file indicated by a descriptor NUM.

get_byte(NUM)
     :: 識別子 NUM のファイルから 1 バイト読む.

     :: Reads a byte from the file indicated by a descriptor NUM.

put_byte(NUM,C)
     :: 識別子 NUM のファイルに 1 バイト C を書く.

     :: Writes a byte C to the file indicated by a descriptor NUM.

purge_stdin()

purge_stdin()
     :: 標準入力のバッファをクリアする.

     :: Clears the buffer for the standard input.

return
     open_file() : 整数 (識別子); close_file() : 1; get_line() : 文字列; get_byte(), put_byte() : 整数

     open_file() : integer (fild id); close_file() : 1; get_line() : string; get_byte(), put_byte() : integer

filename
     ファイル名 (パス名)

     file (path) name

mode
     文字列

     string

num
     非負整数 (ファイル識別子)

     non-negative integer (file descriptor)

  * open_file() はファイルをオープンする. MODE 指定がない場合読み出し用, MODE 指定がある場合には, C の標準入出力関数 fopen() に対するモード指定とみなす. たとえば新規書き込み用の場合 "w", 末尾追加の場合 "a" など. 成功した場合, ファイル識別子として非負整数を返す. 失敗の場合エラーとなる. 不要になったファイルは close_file() でクローズする.

  * get_line() は現在オープンしているファイルから 1 行読み, 文字列として返す. 引数がない場合, 標準入力から 1 行読む.

  * get_byte() は現在オープンしているファイルから 1 バイト読み整数として返す.

  * put_byte() は現在オープンしているファイルに 1 バイト書き, そのバイトを整数として返す.

  * ファイルの終りまで読んだ後に get_line() が呼ばれた場合, 整数の 0 を返す.

  * 読み出した文字列は, 必要があれば sub_str() などの文字列処理関数で加工したのち eval_str() により内部形式に変換できる.

  * purge_stdin() は, 標準入力バッファを空にする. 関数内で get_line() により標準入力から文字列を受け取る場合, 既にバッファ内に存在する文字列による誤動作を防ぐためにあらかじめ呼び出す.

  * open_file() opens a file. If MODE is not specified, a file is opened for reading. If MODE is specified, it is used as the mode specification for C standard I/O function fopen(). For example "w" requests that the file is truncated to zero length or created for writing. "a" requests that the file is opened for writing or created if it does not exist. The stream pointer is set at the end of the file. If successful, it returns a non-negative integer as the file descriptor. Otherwise the system error function is called. Unnecessary files should be closed by close_file().

  * get_line() reads a line from an opened file and returns the line as a string. If no argument is supplied, it reads a line from the standard input.

  * get_byte() reads a byte from an opened file and returns the it as an integer.

  * put_byte() writes a byte from an opened file and returns the the byte as an integer.

  * A get_line() call after reading the end of file returns an integer 0.

  * Strings can be converted into internal forms with string manipulation functions such as sub_str(), eval_str().

  * purge_stdin() clears the buffer for the standard input. When a function receives a character string from get_line(), this functions should be called in advance in order to avoid an incorrect behavior which is caused by the characters already exists in the buffer.

     [185] Id = open_file("test");
     0
     [186] get_line(Id);
     12345

     [187] get_line(Id);
     67890

     [188] get_line(Id);
     0
     [189] type(@@);
     0
     [190] close_file(Id);
     1
     [191] open_file("test");
     1
     [192] get_line(1);
     12345

     [193] get_byte(1);
     54                   /* the ASCII code of '6' */
     [194] get_line(1);
     7890                 /* the rest of the last line */
     [195] def test() { return get_line(); }
     [196] def test1() { purge_stdin(); return get_line(); }
     [197] test();
                          /* a remaining newline character has been read */
                          /* returns immediately */
     [198] test1();
     123;                 /* input from a keyboard */
     123;                 /* returned value */

     [199]

参照

References
     eval_str, str_len str_chr sub_str.