endmacro の戻り値No.05575
santoku さん 10/04/16 13:03
 
endmacroのパラメータに "" を明示しなければ、以前の戻り地が継承されます。
これは仕様ですか?
(パラメータのないendmacroは空文字を返して欲しい)


// test1.mac (このマクロを起動する)
execmacro currentmacrodirectory + "\\test2.mac";
$s = getresultex(-1);
if( $s == "" ) message "empty";
else message $s;
endmacro;

// test2.mac
execmacro currentmacrodirectory + "\\test3.mac";
endmacro;

// test3.mac
endmacro "test3.macの戻り値";

[ ]
RE:05575 endmacro の戻り値No.05578
秀丸担当 さん 10/04/16 14:23
 

>endmacroのパラメータに "" を明示しなければ、以前の戻り地が継承されます。
>これは仕様ですか?
>(パラメータのないendmacroは空文字を返して欲しい)

パラメータがあることが前提のため、パラメータが無い場合は仕様としては不定
ということになってしまいますが、空にしたほうがいいと思います。
V8.01では空になるように修正させていただきます。

[ ]
RE:05578 endmacro の戻り値No.05581
IKKI さん 10/04/16 23:09
 
こんにちは。ユーザの IKKI です。

> >endmacroのパラメータに "" を明示しなければ、以前の戻り地が継承されます。
> >これは仕様ですか?
> >(パラメータのないendmacroは空文字を返して欲しい)
>
> パラメータがあることが前提のため、パラメータが無い場合は仕様としては不定
> ということになってしまいますが、空にしたほうがいいと思います。
> V8.01では空になるように修正させていただきます。

これを修正するのであれば、return 文も同じ動作にしてほしいです。

// 空文字列を表示してほしい.mac
call A;
call B;
message $$return;
endmacro;
A:
return "A";
B:
return;

[ ]
RE:05581 endmacro の戻り値No.05584
秀丸担当 さん 10/04/19 11:51
 

>これを修正するのであれば、return 文も同じ動作にしてほしいです。

ご指摘ありがとうございます。
returnも同じでしたか。
call〜returnは今までのマクロでも非常に多く使われていると思うので、いまま
で偶然動いていたマクロがあったとすると、それが誤動作となってしまう可能性
もあるかもしれないと思いました。
やはり仕様が変わるのは良くないかもしれないということで、santokuさんのご
報告のほうも申し訳ないですが、いまのところこのままとさせていただいたほう
がいいかもしれないです。

[ ]
RE:05584 endmacro の戻り値No.05598
santoku さん 10/04/21 23:46
 
>やはり仕様が変わるのは良くないかもしれないということで、santokuさんのご
>報告のほうも申し訳ないですが、いまのところこのままとさせていただいたほう
>がいいかもしれないです。

結論はお任せするとして

returnは、受け渡しで型を一致させる必要があり、パラメータのないreturnは型が不
明。なのでユーザーは受け渡しに注意を払う。

endmacroが戻せるのは文字列のみである。かつ、endmacro ""; とするような習慣が
ない今、2重3重にネストした先のexecmacroの戻り値がパラメータのないendmacro
を中継して継承されるなんて…
endmacroにパラメータがなければnil相当の空文字を返すのは、問題よりも恩恵の方
が多いような気がするのですが…

[ ]
RE:05598 endmacro の戻り値No.05600
秀丸担当 さん 10/04/22 09:45
 

>endmacroが戻せるのは文字列のみである。かつ、endmacro ""; とするような習慣が
>ない今、2重3重にネストした先のexecmacroの戻り値がパラメータのないendmacro
>を中継して継承されるなんて…
>endmacroにパラメータがなければnil相当の空文字を返すのは、問題よりも恩恵の方
>が多いような気がするのですが…

その通りだと思います。
call〜returnと一緒に考えようとしていることが変でした。
call〜returnはそのままにして、endmacroについては、やはり空の文字列になる
というようにさせていただきます。

[ ]