| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
8.1 入出力について 8.2 ファイル 8.3 後戻し 8.4 入出力に関する諸定義
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
他のファイル操作の命令は: SAVE,FASSAVE,STORE,LOAD,LOADFILE,RESTORE,UNSTORE,STRINGOUT,BATC, BATCON,DEMO,WRITEFILE,CLOSEFILE,DELFILE,REMFILEとAPPENDFILEである。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
例えば、
F(N):=(INTEGRATE(X^N,X),SUBST(3,X,%%)-SUBST(2,X,%%)); は本質的に F(N):=BLOCK([%%], %%:INTEGRATE(X^N,X),SUBST(3,X,%%)-SUBST(2,X,%%)); |
バッチファイルはMACSYMAの命令行の集まりから構成され、各々の行の末尾には;か$ があり、これらは、スペース、キャリッジ-リターン(CR)、フォーム-フィード等で 分けられていても良い。BATCH関数は一度にファイルから命令行を読み、それらを 利用者の端末に表示して実行する。深刻なエラーが生じた場合と、ファイル末端に 達した場合にのみ、利用者の端末側に制御が戻される。勿論、利用者はどの時点でも Control-Gを押せば、このファイル処理を止められる。BATCHファイルはテキスト エディタやSTRINGOUT命令を用いて構築しても良い。詳細はDESCRIBE(STRINGOUT)を 実行せよ。DESCRIBE(FILE);とDESCRIBE(FILES);にはファイル引数がどの様に解釈さ れるかと云ったファイルの一般的な追加情報がある。
この理由で全て大文字でシステム変数と関数を構築した為、利用者は(大文字や小文字 であろうが)好きに入力して良い。しかし、全ての他の変数と関数は微妙である。 例えば、grind(fundef(f))を用いてプログラムを表示した時、'IF','SIN',...の様な 文字は全て大文字となり、非システム文字は利用している書式で表示される事となる。
これは次の様に実装されている:文字が最初に現われると、その大文字のものが パッケージに含まれており、非自明な関数や属性リストを持っていれば、大文字が 用いられ、大文字と小文字が混ざっている場合には、今後、大文字を使う様に記録 される。もし、文字が既にパッケージにあれば、それが用いられる。
これは最も古いプログラムが動作する事を継続しなけばならず、新しいものはsIn, Sin,SIN,sin等と書かれるかもしれないが、それらは全てSINとして解釈される事を 意味する。しかし、それらがMySinと書かれた場合、これはMYSINとは違う。何故なら、 MYSINはシステム関数でも変数でも無い為である。
SeriesSolve(f,x):= if (f = sin) ... は次の様にも読める SeriesSolve(f,x):= IF (f = SIN) ... |
COLLAPSE([expr1,...,exprN])$を用いて、幾つかの式を一緒に潰す事も可能である。 同様に、COLLAPSE(LISTARRAY('A))$とする事で、配列の成分を潰す事も出来る。
(C5) sconcat("xx[",3,"]:",expand((x+y)^3));
(D5) xx[3]:Y^3+3*X*Y^2+3*X^2*Y+X^3
|
(C1) B[1,2]:X-X^2;
2
(D1) X - X
(C2) display(B[1,2]);
2
B = X - X
1, 2
(D2) DONE
|
(* 訳者注:
(C36) integrate(f(x),x,0,inf);
INF
/
[
(D36) I f(x) dx
]
/
0
(C37) display2d:false;
(D37) FALSE
(C38) integrate(f(x),x,0,inf);
(D38) 'INTEGRATE(f(x),x,0,INF)
*)
|
例:
User PART INPART
a-b; A - B A + (- 1) B
A - 1
a/b; - A B
B
1/2
sqrt(x); SQRT(X) X
4 X 4
X*4/3; --- - X
3 3
|
(C1) ERROR("The function", FOO,"doesn't like", U,"as input.");
は、次の様に表示される:
The function FOO doesn't like ERREXP1 as input.
もし、ERROR_SIZE>24であれば;
E
D
C + B + A
The function FOO doesn't like -------------- as input.
COS(X - 1) + 1
となる。
|
ERROR_SIZEよりも大きな式は文字列で置換され、文字列には式が設定されている。 文字列は利用者が設定可能なリストから取られる。
ERROR_SYMS:[ERREXP1,ERREXP2,ERREXP3] |
このスイッチのデフォルト値は利用者の経験に依存するもののに換えても良い。 デフォルト値が大き過ぎたり小さ過ぎたりすれば、MACSYMAにメイルを送る事。
FILEDEFAULTS('file) - 現行のファイルデフォルトを"file"に設定する。
FILEDEFAULTSの引数は、命令が主にプログラム内部で使われると予想される時に評価 される。"file"は実在のファイルである必要は無いので、この関数を、例えば、本当 の目的が単にその他の設定に気に掛ける事の無い何処の"device"欄に設定するもので あっても良い。
FILE_SEARCH("filename");は FILE_SEARCH_LISP、FILE_SEARCH_MAXIMAと FILE_SEARCH_DEMO変数で指定されたディレクトリやデバイス上の検索を行い、最初に 見付けたファイルの名前を返す。この関数はLOAD関数によって呼出される。そんな 訳で、LOAD("FFT")がshare/fft.macを見付けて読込が行える。適当なリストに対して 検索経路を加えても良い。検索経路の書式は指定する複数の拡張や複数の検索経路を 許容する事に注意せよ。
"/home/wfs/###.{o,lisp,mac,mc}"
"/home/{wfs,joe}/###.{o,lisp,mac,mc}"
|
この'###'は渡された実際のファイル名で置き換えられる。FILE_SEARCHは様々な パターンで代入される前に、渡された検索経路上に実際に名前が存在するか どうかを最初に検査をする。
(* 訳者注: maxima(<5.9pre)のソースファイルではsrc/init_max1.lispでデフォルト値の設定が 行われている。 *) |
LIMIT FASL DSK MACSYM being loaded そして文字列の書式は次の様になる; DSK:MACSYM;LIMIT FASL being loaded |
文字列書式はトップレベル(DDT)ファイル指定に似ている。
(訳者注: つまり、入力行の先端のプロンプトの文字の事。 (C1) inchar; (D1) C (C2) inchar:ZZ; (D2) ZZ (ZZ2) 1+1; (D2) 2 (ZZ3) の様に、デフォルトのCからZZ等に変更出来る。 *) |
注意:LOADは、ファイルがBATCH処理に対応している事を見付けると、BATCHLOADを用い る(これは、"黙って"端末に出力やラベルを出力せずにファイルのBATCH処理を実行す る事を意味している)。
他のファイルのロードを行うMACSYMA命令は:LOADFILE、RESTORE、BATCHとDEMOがある。 詳細はDESCRIBE(命令);を実行せよ。LOADFILEとRESTOREはSAVEで書込んだファイルに 対して動作する;BATCHとDEMOはSTRIGNOUTで書込まれたり、テキストエディタで命令の リストとして生成されたファイル向けである。
もし、LOADがファイルを見付ける事が出来なければ、FILE_SEARCHの値が適切な雛型を 含んでいるかを確認せよ。
例えば、
(C4) load("eigen");
MACSYMA BUG: Unknown file type NIL
Error: macsyma error
Error signalled by MEVAL1.
Broken at $LOAD. Type :H for Help.
MAXIMA>>:q
であれば、ファイルシステムを調べてファイルが実際に/public/maxima/share/eigen.mc
にある事を見付けたとする。それから、ファイル検索パスにそれを追加する。これは
起動時(システムディレクトリのsys-init.lspを見よ。)か、局所的なディレクトリと
検索経路名でカスタマイズされ、一度再保存されたシステムで実行可能となる。
LISPの階層では、次の様にする
(in-package "MAXIMA")
(setq $file_search ($append (list '(mlist)
"/tmp/foo.mac" "/tmp/foo.mc") $file_search))
そして、MAXIMAの階層では:
(C5) file_search:append(["/public/maxima/share/foo.mc"],
file_search)$
とする。
(* 訳者注:
大域変数file_searchにfoo.mcのパスをAPPENDしている事に注目。
尚、ソースレベルでの追加はsrc/init_max1.lispに行う。
*)
(C6) load("eigen");
/usr/public/maxima/share/eigen.mcのバッチ処理の実行
(D6) #/public/maxima/share/eigen.mc
(C7) eigenvalues(matrix([a,b],[c,d]));
2 2
- SQRT(D - 2 A D + 4 B C + A ) + D + A
(D7) [[---------------------------------------,
2
2 2
SQRT(D - 2 A D + 4 B C + A ) + D + A
-------------------------------------], [1, 1]]
2
(C8)
|
(訳者注: (C1) 1+1; (D1) 2 の様に、結果が表示される行のD*の事。 *) |
(訳者注: 入力がb/4であれば、1/4*bと表示される事。但し、a/bの様に、a,bが不定元であれば、 通常のプリティプリントで表示される *) |
例えば:
TCL_OUTPUT([x1,y1,x2,y2,x3,y3],1) --> {x1 x2 x3 }
TCL_OUTPUT([x1,y1,x2,y2,x3,y3],2) --> {y1 y2 y3 }
TCL_OUTPUT([1,2,3,4,5,6],1,3) --> {1 4}
TCL_OUTPUT([1,2,3,4,5,6],2,3) --> {2 5}
|
(C1) INTEGRATE(1/(X^3+2),X)$
(C2) REVEAL(%,2);
(D2) Negterm + Quotient + Quotient
(C3) REVEAL(D1,3);
ATAN LOG
(D3) - Quotient + ---------- + ----------
Product(2) Product(2)
|
(* 訳者補足:
次の例の様に、depthで指定された階層までの式を表示する。
(C14) aa:INTEGRATE(1/(X^3+2),X)$
(C15) aa;
1/3
2 X - 2
ATAN(------------)
2 1/3 2/3 1/3 1/3
LOG(X - 2 X + 2 ) 2 SQRT(3) LOG(X + 2 )
(D15) - ----------------------- + ------------------ + -------------
2/3 2/3 2/3
6 2 2 SQRT(3) 3 2
(C16) reveal(aa,1);
(D16) Sum(3)
(C17) reveal(aa,2);
(D17) Negterm + Quotient + Quotient
(C18) reveal(aa,3);
ATAN LOG
(D18) - Quotient + ---------- + ----------
Product(2) Product(2)
(C19) reveal(aa,4);
LOG ATAN(Quotient) LOG(Sum(2))
(D19) - ---------- + -------------- + -----------
Product(2) Expt SQRT 3 Expt
(C20) reveal(aa,5);
Sum(2)
ATAN(----------)
LOG(Sum(3)) Product(2) LOG(X + Expt)
(D20) - ----------- + ---------------- + -------------
6 Expt 2/3 2/3
2 SQRT(3) 3 2
(C21)
*)
|
(* 訳者注:
以下に示す様にデフォルトでは積に*は表示されない。この*を表示させる為のスイッチ
である。
(C2) STARDISP;
(D2) FALSE
(C3) sin(x)*exp(-2*pi*x);
- 2 pi x
(D3) %E SIN(x)
(C4) stardisp:true;
(D4) TRUE
(C5) sin(x)*exp(-2*pi*x);
- 2*pi*x
(D5) %E *SIN(x)
*)
|
ラベルの場合は左側の式のラベル番号が生成される。ファイル名が与えられた場合、 その出力はファイルの末尾に追加される。
(C1) integrate(1/(1+x^3),x);
2 x - 1
2 ATAN(-------)
LOG(x - x + 1) SQRT(3) LOG(x + 1)
(D1) - --------------- + ------------- + ----------
6 SQRT(3) 3
(C2) tex(d1);
$$-{{\log \left(x^{2}-x+1\right)}\over{6}}+{{\arctan {{2\>x-1}\ov
\sqrt{3}}}}\over{\sqrt{3}}}+{{\log \left(x+1\right)}\over{3}}
(D2) (D1)
(C6) tex(integrate(sin(x),x));
$$-\cos x$$
(D6) FALSE
(C7) tex(d1,"/tmp/jo.tex");
(D7) (D1)
|
with_stdout("_hist.out",
for i:1 thru length(hist) do (
print(i,hist[i]))),
system("xgraph -bar -brw .7 -nl < _hist.out")
|
system("(xgraph -bar -brw .7 -nl < _hist.out; rm -f _hist.out)&")
|
mygnuplot(f,var,range,number_ticks):=
block([numer:true],
with_stdout("/tmp/gnu",
for x:range[1] thru range[2] step
(range[2]-range[1])/number_ticks
do (print(x,at(f,var=x)))),
system("echo \"set data style lines; set title '",
f,"' ;plot '/tmp/gnu'
;pause 10 \" | gnuplot"));
(C8) with_stdout("/home/wfs/joe",
n:10,
for i:8 thru n
do(print("factorial(",i,") gives ",i!)));
(D8) FALSE
(C9) system("cat /home/wfs/joe");
factorial( 8 ) gives 40320
factorial( 9 ) gives 362880
factorial( 10 ) gives 3628800
(D9) 0
|
| [ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |