古賀@東工大です。
> 藤井@山口大学と申します。
>
> compiler の動作についての質問です。
Complilerの動作原理に関わる難しい質問ですね。
> CoMatrix として宣言した行列に、一度でも null matrix [] を
> 代入してしまうと、その先の処理では、もともとの行列を CoMatrix
> としては扱ってくれません。例えば
>
> >CoMatrix C ;
> >Complex tmp ;
> >
> > read C ;
> > if(condition A){
> > C = [] ;
> > }
> > tmp = C(1,1) ;
>
> とすると、compiler は 「tmp と C(1,1) では型があわないよ」という
> エラーメッセージを返して来ますが、C = [] ではお咎めなしです。
MaTXを使っている方で「CoMatrix宣言」を知っている人はあまり多くないと思います。
というのは,すべての行列の宣言は「Matrix宣言」を使えば良いからです。では,
なぜ CoMatrix, PoMatrix, RaMatrix のような宣言があるのでしょうか?
次の2つのプログラムを使って理由を説明します。
------------------------------------------------------------
Program-1 | Program-2
------------------------------------------------------------
afo.mm | afo2.mm
|
Func void afo() | Func void afo2()
{ | {
Matrix a; | Matrix a;
void foo(); | void foo2();
|
a = [1 2]; | a = [(1,2), (3,4)];
foo(a); | foo2(a);
} | }
|
------------------------------------------------------------
foo.mm | foo2.mm
|
Func void foo(a) | Func void foo2(a)
Matrix a; | CoMatrix a;
{ | {
print a(1,1); | print a(1,1);
} | }
|
------------------------------------------------------------
Program-1は afo()で a に実行列を代入していますが,Program-2は afo2()
で a に複素行列を代入しています。そして,a を引数として foo() と foo2()
をそれぞれ呼び出しています。注意して欲しいのは,foo() では引数が Matrix
宣言されているのに,foo2() では CoMatrix 宣言されていることです。
もし,このCoMatrix宣言が無ければ,コンパイラは a(1,1) が複素数で
あることを知ることができないのです。(インタプリタなら分かります)
なぜなら,行列 a の実体(大きさ,型)は実行時にならないと決まらないからです。
行列だけの演算(和差積商など)しかないなら,行列の大きさや型による演算の違いは
クラスライブラリが引き受けてくれるので,CoMatrixのような宣言は必要ありません。
したがって,次の注意が必要になります。
o 関数を定義するとき,あらかじめ引数の型が詳しく分かっているなら,
その宣言をする。関数自身の型(戻り値)も同じ。
o 条件分岐によって行列の型が変わる場合,型変換関数を使って型を
指定する。
-----------------------------------------------------------------------------
それから,MaTX の null Matrix に関して補足しておきます。
null Matrix には
real null matrix
complex null matrix
polynomial null matrix
rational null matrix
の4種類があり,`` [] '' は real null matrix を意味します。
現在の MaTX には,real null matrix の記述法しかありませんから,
他の null matrix を入力するには,CoMatrix() や PoMatrix() など
の型変換関数を用いることになります。
結局,
> これを回避するには C = CoMatrix([]) とすればいいのですが、
が答えになります。
--
古賀 雅伸
koga@mei.titech.ac.jp