(1)を流してみれば分かると思いますが、z1の要素として代入したaが(3,4)から(5,12)に
//例(1) #module m1 F1,F2 #modinit array a1 F1=a1.0 : F2=a1.1 return #modfunc mm1 mes "F1="+F1+" : F2="+F2 return #global a=3,4 newmod z1,m1,a : mm1 z1 a=5,12 : mm1 z1 stop
変更されても、z1は相変わらず同じ値です。これはモジュール変数だけではなく普通の変数
計算(2)でも同様です。
//例(2) a=3,4 b=a.0+a.1 : mes b a=5,12 : mes b stop
ところが、以下のソースでは少々様相が違ってきます。
(3)ではz1はz2の要素です。[newmod z2,m2,z1]と入力した段階で、z2はその時点での
//例(3) #module m1 F1,F2 #modinit int i1,int i2 F1=i1 : F2=i2 return #modfunc mm1 mes "F1="+F1+" : F2="+F2 return #modfunc m1renew int i1,int i2 F1=i1 : F2=i2 return #global #module m2 F1 #modinit array a1 F1=a1 return #modfunc mm2 mm1 F1 return #global newmod z1,m1,3,4 : newmod z2,m2,z1 : mm2 z2 m1renew z1,5,12 : mm2 z2 stop
z1の情報を取り込んでいるはずで、この後z1にいくら変更が加えられてもz2には一切影響を
与えないはずです。
が、[m1renew z1,5,12]とz1の情報を変更した後でz2の情報を呼び出してみると、z2は
z1変更の影響を受けている事が分かります。
同じような事は#defineマクロでも起こります。
(4)では#defineが定義された状態では(x,y)=(0,0)であるので"X=0 : Y=0"が標準的な
//例(4) #define z "X="+x+" : Y="+y x=3 : y=4 : mes z x=5 : y=12 : mes z stop
文字列ならば返るはずです。ところが、zをマクロとしたせいなのかzが常にxとyの影響を
受けています。
これらのソースから分かるように、一部の定義方法では『変数の値』ではなく、『変数
の名前自身』を取得できるようになっています。
(3)のモジュール変数の要素にモジュール変数を定義する場合、(4)#define命令を
使う場合以外にも、#const命令による定義、dup命令によるクローン複製(魔)でも同じ現象が
起きるようです。
長々とした前置きでしたが本題に入ります。ずはり、ある変数Xを、任意のモジュール変数
Mのクローンにする事はできるかという質問です。
普通に[X=M]と入力してはXが変更されても、それに連動してMが変更されません。dup
命令を利用つまり[dup X,M]と入力すればクローンにはなってくれるのですが、不安定で
よく分かりません。
(一応、[dup X,M]定義後の最初の一回目のXの数値要素の変更はMに反映されるという
事は確認したのですが、文字列要素(str)やモジュール要素(struct)の変更が反映されるのか
よく分かりません。当のHSPDLにさえ『クローン元の型が変更されたり、配列の拡張、または
文字列バッファの拡張が行なわれた場合には、クローンとしての動作は行なわれなくなります』
と書かれているのでdupが信用できるのだかできないのだか分りません)
現在のところはdup命令で妥協しているのですが、なまじ妙な条件付きのせいでいつバグが
起きるのか怖くてたまりません。
なので具体的な質問としては、
Q1,dup命令でモジュール変数の恒常的で安定したクローンは製造できるのか?
(尚、条件としては親モジュール、子、孫、曾孫、玄孫以下全てのモジュールの要素は
数値要素(int)、文字列要素(str)、実数要素(double)、子モジュール要素(struct)のみで、
数値要素は+-6桁以内、文字列要素は20文字以内の無拡張です)
Q2,製造できないとしたらdup命令以外でモジュール変数のクローンは製造できるのか?
以上の2つです。ご指導お願いします。