変数名の作成・変更No.09809
おすぎ さん 22/04/06 16:47
 
お世話になっております。

次のように文字列変数と数値変数があったときに、
 $string = "aa";
 #num[1] = 10;

これらから、次のような配列変数をマクロで作成することは可能でしょうか?
 #aa[1] = 10;

言い換えると、変数名をマクロで変更することは可能でしょうか?

[ ]
RE:09809 変数名の作成・変更No.09810
こみやんま さん 22/04/07 04:53
 
$string = "aa";
#ix = 1;
#value = 10;
#num[#ix] = #value;

eval sprintf("#%s[%d]=%d", $string, #ix, #value);

message str(#aa[1]);

みたいな感じでeval使えばいいのではないでしょうか。

[ ]
RE:09810 変数名の作成・変更No.09811
おすぎ さん 22/04/07 09:11
 
こみやんま さん

ご回答ありがとうございます。

ですが、さっぱり理解できません。
申し訳ありません。

[ ]
RE:09811 変数名の作成・変更No.09812
でるもんたいいじま さん 22/04/07 11:03
 
でるもんた・いいじまです。

> こみやんま さん
> ご回答ありがとうございます。
> ですが、さっぱり理解できません。
> 申し訳ありません。

「さっぱり理解できません」の関門はsprintfですかね。

eval sprintf("#%s[%d]=%d", $string, #ix, #value);
ここの部分を
$data = sprintf("#%s[%d]=%d", $string, #ix, #value);
message $data;
eval $data;
のようにしてみればわかりますが、このsprintf関数で "#aa[1]=10" という文字列を
生成しています。

この機会にsprintfの使い方を勉強されてもいいと思いますが(いろんな言語で使え
ますし)、それまでの間はsprintfを避けて
eval "#"+$string+"["+str(#ix)+"]="+str(#value);
としてもいいと思います。

[ ]
RE:09812 変数名の作成・変更No.09813
こみやんま さん 22/04/07 13:57
 
おすぎさんが、sprintfで躓いていいる可能性もありますが、
発想的なものがピンときてないのかも。

1つずつ理解していけば、何をしているのかという発想にすぐに到達できるかと思い
ます。

===============================================================
■理解の第1段目
------------ test.mac --------------

message "OK";

------------------------------------
とあるとします。

おすぎさん的には、これは

"""
 message という命令文に "OK" という引数がある。全体はテキストではない!!
"""

と思うことでしょう。

しかしながら、よくよく考えてみてください。
眼前のものを客観的によく見ましょう。
一歩引いた視点で考えると、

"""
test.mac というファイルに、
「message "OK";」という文字列が書かれている
"""

にすぎません。


test.mac に 予め message "OK"; という文字列を書いておき
保存しておいたのです。
それを「たまたま」秀丸マクロとして実行したら、プログラムとして動作したのです。



===============================================================
■理解の第2段目


では事前にマクロファイルに(秀丸マクロとして通用する)文字列を用意するのではな
く、
「マクロ実行時に」(秀丸マクロとして通用する)文字列を生成するのはどうすれば
よいのか。

これは難しくないことでしょう。
きっと普段から文字列変数は利用されておられるはずです。

ただ、その文字列の中身が、
「たまたま」「秀丸マクロとして実行可能な文法に沿っている」「文字列」なだけで
す。

------------ test2.mac --------------

$msg = "message \"OK\";";
message $msg;

------------------------------------

実行してみるとダイアログには「message "OK";」と出ます。


===============================================================
■理解の第3段目

さきほど用意した 'message "OK";' は「秀丸マクロにとっての文字列」でした。

ではこの「文字列の内容」を、秀丸マクロの「命令文として実行する」にはどうすれ
ばよいのでしょうか。

これが eval です。

------------ test3.mac --------------

$msg = "message \"OK\";";
eval $msg;           // message "OK"; という命令が書いてあったのと同じことに
なる。

------------------------------------




===============================================================
■最初の命題に戻る

「#aa[1] = 10;」という文字列を秀丸マクロ実行時に生成し、これを秀丸マクロとし
て実行してみる

------------ test4.mac --------------

$msg = "#aa[1] = 10;";
message $msg;
eval $msg;           // #aa[1]=10; という命令が書いてあったのと同じことになる。
message str(#aa[1]);

------------------------------------


===============================================================
■汎用性を持たせる

------------ test5.mac --------------

$string = "aa";
#ix = 1;
#num[#ix] = 10;

$msg = "#" + $string + "[" + str(#ix) + "]" + "=" + str(#num[#ix]) + ";";
       // 「+」が多くて目がチカチカしますが、
       // 「#aa[1]=10;」という文字列を作っている

message $msg;
eval $msg;           // #aa[1]=10; という命令が書いてあったのと同じことになる。
message str(#aa[1]);

------------------------------------



===============================================================
■目がチカチカする部分を改善

$string = "aa";
#ix = 1;
#num[#ix] = 10;

$msg = sprintf("#%s[%d]=%d", $string, #ix, #num[#ix]);
       // 「#X[Y]=Z;」という形に引数のパラメータを当てはめて文字列を作っ
ている

message $msg;
eval $msg;           // #aa[1]=10; という命令が書いてあったのと同じことになる。
message str(#aa[1]);

------------------------------------

以上です。


[ ]
RE:09813 変数名の作成・変更No.09814
こみやんま さん 22/04/07 14:22
 
配列の転写に関しては、秀丸には
array_copy(#num, #aa);
みたいなものは「ない」ので

$new_varname = "aa";
#ix = 0;
#num_array_len = 1000; // 十分な数

#num[0] = 100;
#num[1] = 200;
#num[2] = 0;
#num[3] = 4;
#num[4] = 10;

while( #ix < #num_array_len ) {
    $cmd = sprintf("#%s[%d]=%d", $new_varname, #ix, #num[#ix]);
    eval $cmd;
    #ix = #ix + 1;
}


message str(#aa[0]);
message str(#aa[2]);
message str(#aa[4]);

みたいに予め十分な長さ(今回の例は1000)を決め打ちしてやるしかないと思います。
配列の中身に決して0が無いと断言できるのであれば、長さを決め打ちする代わりに0
が出現するところで打ち切ればよいかと思います。

[ ]
RE:09814 変数名の作成・変更No.09815
おすぎ さん 22/04/07 14:37
 
こみやんまさん、でるもんたいいじまさん

詳しい解説をありがとうございました。
お二人のメールを読み込んで理解しようと思います。
sprintf, eval など初めてのコマンドなので、やや戸惑っていますが、
分からないことが出てきたらまた教えて下さい。

ありがとうございました。

[ ]