外部マクロ呼び出しについてNo.06207
A1 さん 09/08/14 21:26
 

はじめまして、 A1 といいます。
秀丸歴は10年以上ですが、マクロの利用歴はその半分以下です。

暫く ROM をやっていたのですが、 V8. で新設される機能の中に「悲願(大袈裟)」
ともいえる

    「execmacro に於ける引数渡し」

が在るのを見て、(普段使わない)β版を DL してヘルプを覗いて見ました。

-------

気になった事が幾つか在ります。

    ※「要望」というよりも「こういうのはネタとしてアリだろうか?」という
    (一般論的な)疑問の段階の為、「β版会議室」ではなくこちらに投稿する次第
です。

    (1) 実引数の取得:
            getarg() も良いが、(呼び出され側のメインルーチンで)$$1,$$2 ..
等で取得できないか

    (2) 戻り値の取得:
            (endmacro/return 文の拡張などで)$$return に戻り値を得ることは
できないか

        ※参考: <秀丸エディタ マクロ作者会議室 - スレッド05505, 07/04/26>

    (3) goto 型の外部呼出し:
            (call 型の) execmacro とは異なり、呼び出し元に処理を返さない外部
呼出しはできないか

(1),(2) は「サブルーチンのコードをそのまま切り取って外部モジュール化できたら
良いな〜」
と以前から思っていたもので、「悲願」達成を目前にして急に欲が出てきたという次
第です。

(3) は少し特殊で、現在の execmacro は呼び出し元のマクロの状態(コードと変
数)を(仮想的な)
「スタック」に積んでから、実行後に呼び出し元に戻るという動作をしてるように見
えますが、
execmacro のネストには制限があって(記憶で申し訳ないのですが) 秀丸5.09 + Wi
n2000SP3 の
時は確か 6〜7 段でアウトになっていました。

マクロ中でサブマクロを呼び出すのはよくあることですが、通常の使い方であれば
この制限に引っかかることはまずありません。

ところが、予め登録した中からメニューを組んで、ユーザに選ばせた別のマクロを呼
び出す
「ランチャー」のようなマクロの場合、それ自身が「スタック」を一つ消費してしま
うため、
目的のマクロを呼び出す時点でネストに余裕がなくなってしまいます。
execmacro に引数が導入されてもこの状況は変わりません。

    ※slide_moon さんの 「MacroLink」 は自分自身を再帰的に用いることができる
が、
    この機能を活用しようとして上の制限に引っかかってしまい、
    単一マクロでネストしたメニューを出せるようなものを自作した。

更に、「ランチャー(A)」は目的のマクロ(B)を呼び出せばそこで仕事は終わりなので
「呼び出し元に処理を返す必要がない」マクロの典型といえます。
なので、goto 型の呼び出し(A のマクロ状態をクリアして最初から B が
指定されたかのように B を実行)が実現されれば、上で述べた心配事がひとつ減り
ます。

-------

(1),(2) については、過去ログに議論があったのですが、 (3) に相当する話題を
見付けられなかった為、このタイミングで提起してみました。
「秀丸担当」さんに限らず、マクロの作者さん等にもご意見を伺いたいです。

よろしくお願いします。

    ※ 個人的妄想ですが、 V8.β を見るまで以下のように考えていました。

        {call "ファイル名[:ラベル]" 引数1, 引数2, ..;}
        {goto "ファイル名[:ラベル]" 引数1, 引数2, ..;}
        {return 戻り値;} は状況により {endmacro 戻り値;} を兼ねる
        {execmacro "ファイル名";} は盲腸

    …キーワードあまり増えて欲しくないんです (^^;


[ ]
RE:06207 外部マクロ呼び出しについてNo.06208
h-tom さん 09/08/16 20:55
 

h-tom です。

>    (1) 実引数の取得:
>            getarg() も良いが、(呼び出され側のメインルーチンで)$$1,$$2 ..
>            等で取得できないか
>
>    (2) 戻り値の取得:
>            (endmacro/return 文の拡張などで)$$return に戻り値を得ることは
>            できないか
(1),(2)は、いっそのこと、includeできるようにしてもらったほうがいいような、
気もします。
(2)は、現状でもほしいところですが、静的変数をつかえということでしょうか。

>    (3) goto 型の外部呼出し:
>            (call 型の) execmacro とは異なり、呼び出し元に処理を返さない外部
>            呼出しはできないか
(3)ですが、個人的には、 6〜7 段もあれば問題ないような気がします。
(特に多重呼び出しで、トラブった覚えもないので。)

[ ]
RE:06208 外部マクロ呼び出しについてNo.06209
秀丸担当 さん 09/08/18 16:04
 

>    (1) 実引数の取得:

$$1などは内部的な処理の都合もあってややこしくなるということもあり、現状の
ままとさせていただきたいと思います。

>    (2) 戻り値の取得:

これはあったほうがいいかもしれません。
endmacroにパラメタを付けて、取得する関数が必要ですが getresultex を流用し
てしまおうかと思います。

>    (3) goto 型の外部呼出し:

とりあえず、ネストできる上限を現状の5から10に増やしておこうと思います。

[ ]
RE:06209 getresultex() についてNo.06210
Iranoan さん 09/08/18 21:46
 
 秀丸担当さん今日は、Iranoan です。
> endmacroにパラメタを付けて、取得する関数が必要ですが getresultex を流用し
> てしまおうかと思います。
 こちらについて、末尾のマクロのように、getresultex() の引数を -1 にし
た時のみ、文字列で返すということで宜しいでしょうか?
 マニュアルのための単なる確認です。
//------------------------------------------------------------
execmacro "execmacro.mac";
message str(getresultex(0));//str() を使わないとエラー
message getresultex(-1);
//execmacro.mac -----------------------------------------------
endmacro currentmacrobasename;

[ ]
RE:06207 外部マクロ呼び出しについてNo.06211
A1 さん 09/08/18 23:38
 

A1です。レスありがとうございます。

ワガママを振ってしまいましたが、 V8.0β7 で一部対応していただきました。
この場を借りて御礼申し上げます。

以下、(再び)長いです。

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

(1) 実引数の取得

h-tom さん:

>(1),(2)は、いっそのこと、includeできるようにしてもらったほうがいいような、
>気もします。

 冒頭に集まってくれた方が依存関係も分かり易いですし。


秀丸担当さん:

>$$1などは内部的な処理の都合もあってややこしくなるということもあり、現状の
>ままとさせていただきたいと思います。

 分かりました。

 ところで、以前から(call で呼び出されていない)メインルーチン上でも
  $$1 等と書けて、かつ参照できてしまうのですが、これは反則でしょうか?

  ※こういう挙動だったので、「部品化」について「文法的な準備は出来ている」
  と安易に考えていたのです…
  ※サブルーチンの戻り値も、呼び出しと独立している( $$return を
  使っても捨てても良い)ので有利だと思ってたのですが、問題が…(後述)


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

(2) 戻り値の取得

h-tom さん:

>(2)は、現状でもほしいところですが、静的変数をつかえということでしょうか。

 親子間で「符丁」を決めなければならないのと、呼び出しがネストした場合に

  「「子」が書き換えたのか「孫」が書き換えたのか判らん」

 という状況が在り得ると思います。

  ※静的変数自体は「この為だけに田楽」という状況を減らせるので大変有難いです。


秀丸担当さん:

>これはあったほうがいいかもしれません。
>endmacroにパラメタを付けて、取得する関数が必要ですが getresultex を流用し
>てしまおうかと思います。

 ありがとうございます。
 getresultex() の引数が -1 なので、少しキワモノに見えますが…

 $$return で取得できるようにした場合、次のような既存のコードで
 問題が生じる可能性を失念していました。関数で良かったです。

 -↓------------------------
 call subA $arg;
 execmacro "macroB.mac";
 $res = $$return; // subA の戻り値? macroB の戻り値?
 -↑------------------------

  ※前回最後の「個人的妄想」の項は「 call の文法を拡張すれば、書き手は
   $$return も意識するだろう」という言い訳だったと、勝手に後付け。 (^^;


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

(3) goto 型の外部呼出し:

h-tom さん:

>(特に多重呼び出しで、トラブった覚えもないので。)

 A1自身、「特殊な」例だと思います。
 実のところ、「ランチャー」以外にはこういう状況に出くわしませんでしたし、
 他に良い例も思いつきませんでした。

 ただ、今度の変更で「部品化」がやり易くなると、今までしぶしぶ2重に
 書いてきたコードを、喜んで切り出したり捨て去ったりしているうちに
 「あれ?」となる局面が出てくるんじゃないかと思ったのですが。

  ※実行効率は低下するので、既にチューニング
  されているコードには余計なお世話かも。

秀丸担当さん:

>とりあえず、ネストできる上限を現状の5から10に増やしておこうと思います。

 ありがとうございます。以下のコードで "11 回目" まで
 出るようになりました(その後エラー)。
 これで困ることは暫くなさそうです。

 -↓- test.mac -------------------
 if(argcount < 1){$a = "1";}
 else            {$a = getarg(0);}
 message $a+" 回目";
 execmacro currentmacrofilename, str(val($a)+1);
 -↑------------------------------


[ ]
RE:06210 getresultex() についてNo.06212
秀丸担当 さん 09/08/19 14:20
 

> こちらについて、末尾のマクロのように、getresultex() の引数を -1 にし
>た時のみ、文字列で返すということで宜しいでしょうか?

A1さんの言われるようにキワモノっぽいですが、そういう仕様ということでお願
いします。

[ ]
RE:06211 外部マクロ呼び出しについてNo.06213
秀丸担当 さん 09/08/19 14:20
 

> ところで、以前から(call で呼び出されていない)メインルーチン上でも
>  $$1 等と書けて、かつ参照できてしまうのですが、これは反則でしょうか?

もし将来A1さんのご提案にあったような仕様(getargを使わず$$1)にすることが
あるとしたら、そういった書き方で何らかの問題が起きるかもしれません。(た
ぶん大丈夫だとは思いますが)
いまのところ動いてしまうようですが、できるだけ使わないほうがいいかもしれ
ません。

> getresultex() の引数が -1 なので、少しキワモノに見えますが…

getresultexを流用してしまったので、キワモノっぽくなってしまいました。
新しい関数を作ったほうがよかったかもしれないですが。
マイナス値としたのは、もしかしたら将来的に複数になるかもしれないと思った
ためです。

[ ]
RE:06212 getresultex() についてNo.06214
Iranoan さん 09/08/19 15:09
 
 秀丸担当さん今日は、Iranoan です。
> > こちらについて、末尾のマクロのように、getresultex() の引数を -1 にし
> >た時のみ、文字列で返すということで宜しいでしょうか?
>
> A1さんの言われるようにキワモノっぽいですが、そういう仕様ということでお願
> いします。
 解りました。

[ ]
RE:06213 外部マクロ呼び出しについてNo.06215
A1 さん 09/08/29 00:54
 
A1です。
一部質問をしたまま、(回答を頂いているのに)放ったらかしになっていました。
申し訳ありません。

ツリーの使い方が変ですが、もう一個書きます。そちらもご一読ください。

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

>>  $$1 等と書けて、かつ参照できてしまうのですが、これは反則でしょうか?
>そういった書き方で何らかの問題が起きるかもしれません。
>できるだけ使わないほうがいいかもしれません。

やはり反則なのですね。控えます。

>getresultexを流用してしまったので、キワモノっぽくなってしまいました。
>新しい関数を作ったほうがよかったかもしれないですが。
>マイナス値としたのは、もしかしたら将来的に複数になるかもしれないと思った
>ためです。

わかりました。

[ ]
RE:06211 外部マクロ呼び出しについてNo.06216
A1 さん 09/08/29 00:55
 
A1です。ここ何日か考えていて、宗旨替えしました。

    ・h-tom さんの include 案に一票
    ・(include 実装を前提に)前回までの戯文(特にNo.06207 の(3))は取り下げ
        ※参考記事を <秀丸エディタ マクロ作者会議室 - スレッド05505, 07/04/
26>
        としていましたが、これはスレッドの頭で、当該記事は <05512, 07/04/28,
 n13 さん> です。

もし「将来はコレで行くつもりなんだけど…」と内々に予定されているアプローチが
あって、それを邪魔する形(「余計なお世話」)で引っ掻き回していたとしたら、
ごめんなさい。

改めて、「外部マクロをリンクする #include 風の構文」を要望します。
あくまで(ここの用語で)「ネタ」ということで…

    ※目安箱とか、七夕の短冊とか、気長に…

以下余談(また長い)です。
ここに出入りされる方には「釈迦に説法」だと思いますが、「A1の拙い認識」という
意味で書きます。

<include 案に一票>

    h-tom さんはご自身の HP で「マクロで#includeを可能にするマクロ」を
    公開されています。その上での発言なのですね。

    A1は「餌くれ」とピーピー騒ぐだけでした。足らぬ足らぬは工夫が足らぬ。
    (本家を見る前に)贋物を作って暫く遊んでみようと思います。
    不要になって削除されるマクロが目標です。

<前回までの戯文は取り下げ>

    テキストレベルのリンクが可能でお互いを call で呼び出せるなら、
    「 execmacro の呼び出しネスト制限」等は気にならなくなります。

    (実装の根が深い)「goto 型」も不要でした。 根深さは include も同様だと
    思いますが、同じなら(今は)こちらを推します。

    固定されたラベルだけではなく、動的に呼び出し先を決定したい場合もあるので、
    文字列で指定できる execmacro は必要ですね(「盲腸」なんて言って済みませ
ん)。

    「goto 型」の話はコマンドラインのバッチファイルに由来するものです
    ("call x.bat" の形でなければ呼び出し元に戻らない)が、ネストの制限が
    頭にあったのでこんなケチ臭い(古臭い)発想になりました。

<余談の余談>

    古臭いといえば、前提となる環境もだいぶ変化しました。

    「動作が殆ど同じなので、パラメータを変えて使い分けたい」という場合、
    従来から execmacro が引数を取れなかったために

        (A) 同内容のマクロを別名で保存し、各々が呼び出された時に
            自身の名前を見て動作を決定する

    という便法がありました(複製用のマクロも公開されています)。
    (A) には呼び出しのネストを 1 コ減らす働きもあります(こっちを意識する人
は少ない?)。
    一方、「同じファイルがいくつもあるのが嫌」と言うことで

        (B) INI ファイルやレジストリや田楽を介して親マクロからパラメータを受
ける

    方法もありますが、こちらも嫌がる人がいます。

        ※実行効率が悪いし、どのみち「短い親マクロ」でも一定量ディスク喰われる

    A1は長いこと (B) だったのですが、

        ※execmacro 引数のお陰で 1 行になった親マクロも、やはり一定量ディス
クを喰う…

    別に (A) でも「ハードリンクならディスク喰わないよ」ということに
    今更ながら気づいて、 ln.exe の使い方を覚えようかというところです。

        ※いつの間にか NTFS が当たり前になってた(Vista じゃ必須だし)。

    …と、思っていたらβ板の方で「マクロ登録で引数」(No.03272 IKKI さん)と
いうネタが
    上がっていました。こうなると (A) も不要になるかもしれません(今のところ
「ネタ」ですが)。

        ※本当はこのスレッドでハードリンクを思い出した

    こういう、前提が激しく変化している中で、以前から温めていたネタを持ち出すと
    「古い」「(方向性が)間違っている」「余計なお世話だ」等とお叱りを受ける
と思います。
    それを覚悟でネタを振ったのですが(いっそツッコまれたかった…)、かなり遅い
    自己解決モードになってしまいました。

<最後に>

    色々と注文を付けてしまいましたが、秀丸の更なる発展を期待しています。

    長文、失礼しました。

                                                            A1

[ ]
RE:06216 外部マクロ呼び出しについてNo.06217
すず さん 09/08/29 03:04
 
suzuです。

include 案にもう一票

[ ]
RE:06217 外部マクロ呼び出しについてNo.06218
Iranoan さん 09/08/29 09:21
 
 今日は、Iranoan です。
> include 案にもう一票
 include というより、
execmacro "lib.mac:subroutine", $parameter;
若しくは、
call "lib.mac:subroutine", $parameter;
の形式でもいいかな。単純な include だと
・名前がバッティングしていたらどうなる?
・多重 include はできるのか? その時のスコープ範囲は?
等面倒なこと (覚えなければいけない仕様(^^;) が多くなるので。

 ##そういえば、秀 Term はこれが出来たんだよな。もう使っていないけど。

[ ]