めざらさん
>?{ #Y .. * }. *
これを見たときから気になっていて、諦めの良い僕としては、このような書き
方する必要は、少なくとも僕には、ない、と結論したのですが。
ほんとうは諦め悪いのか、せっかくかなりしつこく引っかかったので、質問だ
けはさせていただいてしまおうかと、まことに勝手ながら思いました。
何かコメントを頂ければ幸いです。
上は、
>?{ #Y .. * .} *
これと同じ意味ですよね? なぜ、中カッコの外にピリオドを置くのか? そ
して、しかし、どうも、誰もこれに関して、言葉にして疑問を呈したことがない
みたいなのです。「誰も、ない」の部分は、自分のグレップ力にそれほど自信が
あるわけではありませんが。
網羅的に調べたわけではありませんが、上村さんは、下の正統的なスタイルでした。
そりゃそうだろうと思いました。
=== Macrotmp by B ===;
* M
50 ^^ "Macrotmp"
i=1,
:A i++,
(i==5)? .
(i)>? {#d #s} >a>b>c . ;カーソル移動コマンドは無意味。ダミー。
:a &?("A") #m >A
:b &?("B") #m >A
:c &?("C") #m >A
*
答え:
A
A
A
となる。
こんな性質を「利用」してるというか、面白がっているというか、というとこ
ろなのだろう、と思ってます。古くは、N.Myaaさんが使われ始めたみたいでした。
カッコの外にだすと、「終わるぞ」と強調しているみたいに、見えなくはないけど……。
これは、無限ループの罠(ループカウンタが残ってしまう)とは別の事柄です
よね。
* * のほうについては意味は分かっています。こちらも、わざわざそんなこと
をする必要はないよ、と結論したのですが。 すいません、諦めると、見つかってしまうのですねぇ。
引用です。
--------------------------------------------------------------------------
Emmett氏, 95/8/27, <nifty:FGALPK/MES/15/1837>
(a)>?{ . . . } &b (2)
0 1 2 3 4 5
この } が、 (0から数えて)3番目に位置する、独立したひとつの命令だと見
なされてしまうというところです。 多重分岐を実行する場合、VZは { の次か
ら単純に、0、1、2と数えて行って、内部レジスタの値に相当する位置にある
命令を実行する……
のかと思うと、 それじゃぁ例えば a==5 の場合は &b をスッ飛ばして (2) だけ
を実行するかと言うと、そうじゃない。a==4 以上の場合は a の値が幾つであろ
うと、ちゃんと &b から実行します。
--------------------------------------------------------------------------
(ちょっと引用長すぎると感じてます。ごめんなさい。)
後半なんかは、上のマクロの挙動(AAA)と完全に一致する。
しかし、閉じカッコに当たっているのだ、と証明できるマクロのサンプルが
思いつかないのです。3,4,5,6,7 ....で、ビープなってしまいますよね。
そこに当たってるの? とただ、驚き。
どうやって3番目が &b でなく、} だと確認できるのでしょう?
3と4でヒット箇所(!)が違うから、違う挙動を示してくれるマクロって、書け
ますかね? だって、3なら4をしちゃうのだもの。(逆に妄想ですが、これをc.mos
さんは見切っていて、こんな仕様にした、とか。でも、m.gannさんは、そこに危険
を見た、、、。)
Emmettさんを疑っているわけでは、まったくないのですが。
あらゆる状況証拠は、Emmettさんの書いていることを支持してはいるのですが。
もっと難しく、ソースからピンポイントにいうと、榊原さんの指摘、ということになる
でしょうけれど。
結論は最初から分かっています。ふつうに>? {....}と、中に書けばいいじゃん、と。
でも、m.gannさんはぜったい偏愛してると思う。m.gannさんの、vzfl_g2.defとか
さっき見ちゃった。16階、ish部屋でした。vzfl.defにFキーがいっぱい。なるほど。
しかし、[F01]は使ってない。まずのかなぁ。一人相撲でごめんなさい。VzFAQネタに、どうぞ。 m.gann氏, 92/8/5, <nifty:FGALPK/MES/13/318> このあたりだ。本当に、}に当たる。そして、それは確率は低いとはいえ、 とんでもない現象を引き起こす可能性がある。 分かりました。多重分岐で、}に当てることのないよう気をつけます。 そんなところに当たっているとは、ゆめゆめ思わず、、、。 やっぱ無限ループと同根なんだ。>? {.....}とちゃんと数さえ間違えなきゃ、いいんですよね。 ま、怖いから。>? {....}.で、困らないときには、忘れなければ、こうします。いちおう報告。 mg..4=3, (3)>? {...} &m("%d",mg..4) mg..4=3, (4)>? {...} &m("%d",mg..4) なんてやってみたけど、分からず。もしかしたら、「Vzトークン覚え書」の 「 } 」で、もっと濃ゆい説明とかしちゃってもいいのかも、、、。 追伸:知ったかぶりをするつもりはまったくないのですが。 (3)>? {>a>b>c 単体だとエラーになり、 この下に別マクロであっても、} があれば、エラーにならなかったとき、}に 鍵がある、とは思ったんですよねぇ。もちろん、全部は消化できてません。 ただ、少し本気で納得した、という感じです。{}がお祈りとか、{ だけでいいとか 言われると、え、m.gannさんって、そんな審美的な感じであのコード書いてたの? とか思ってしまっていたもので。
過去ログの大きさ? どれくらいの量の情報だと思いますか。 答え、ものすごくアバウトに、文庫本80冊程度でした! m.gannさんのは、中身がわからずに2回ぐらい目にしたことがあった ような感触ですが、Emmettさん記事は、たぶん、本当に初めて。 いっぱい知らないことって、あるんでしょうね。 簡単にどう計算したか。>dir /s ;AP, PK, DCのログディレクトリで>Izgrep -i "LOG" ;xxx.logのみ。-- ignorecase>Izgrep -v "ディレクトリ" ;vzlogなんてディレクトリだったもので。;ゴミ削除。-- versaの意味かな。 ;awkが計算できないというので、byte -> KBへ、3桁カット(矩形ブロックマクロ)>Jgawk "{total+=$3} END {print total}";結果:19145 KB ;文庫本を原稿用紙300枚とし(厚め)、原稿用紙は400字==800 bytes ;インスタントマクロで、掛け算と割り算。19145/240=80 色々あると思うので、70冊から90冊のあいだのどこか、ぐらい? (ish部屋とかも入ってます。) ふう、それは読めんわ。 そして、Vzマクロの貴重な情報というのは、Vzのソースばかりか、 あの膨大なVzマクロ作品のコードにも入ってるんですよね。 榊原さんが言ってたとおり、* * のコメント機能は、コードが読めなくても 明らかなc.mosさんの意図と分かります。see macro.asm. やっぱ使うか。でも、ヘタに背伸びすると、無意味にバグらせそう。
メモ書きの独り言です。m(__)m ======= ゾンビ.DEF by m.xxxx =============================;伏字に意味ある? PK13 #00310 92/08/04 22:53 1 ^K^ で登録したあと、まず、 ^^ で92番のマクロを実行します。何度実行 しても「92番を実行しました」というメッセージが出ることを確認しておい て下さい。 2 次に、^\ で93番のマクロを実行し、何かのキーを押して終了させます。 何度繰り返しても、同じであることを確認しておいて下さい。 3 93番のマクロを終了させた状態で、ふたたび ^^ で92番のマクロを実行 します。 すると、どうでしょう。 ^^ で92番のマクロを実行したつもりでも実際に 実行されるのは93番ではありませんか!! *m 92 ^^ "" a-, :A (a)>?{ #26 #27 } (a++<16)? >A &m("92番を実行しました") &b(3) 93 ^\ "" i-, (-1){ &m("93番の実行中%4d%-32s何かのキーを押すと終了",i++,"") &b(3) &w(15) &k (r)? >B } :B &m("93番を終了しました") * ======= ゾンビ.DEF ======================================= メモです。何となくやってみようと思っただけです。それほど深く追いかけては いません。 上は再現しないと思う。>「(-1){」の「{」が生きたままマクロが終了しているということではないのかな?というのが、くらとさんの回答。 --- 長すぎる引用、ごめんなさい、ありがとうございます >m.gannさん 無限ループはもちろん、有限ループの場合も途中でループを脱出した場合は、 「ゾンビ」の要因が残されてしまいます。 ほとんどの場合は、それが顕在化せずに済むわけですが、低い確率で引き金が 引かれることがあります。「{」よりも「}」の方を先に実行してしまった場合が そうです。 ループカウンタが初期化されていない状態で「}」に出会うと、仕様通りルー プ開始ポインタへジャンプします。「}」はまさにジャンプコマンドなんですね。 蛇足ながら、ループ開始ポインタへ飛ぶ場合、そのマクロがたとえ上書きされ 消滅していてもそのアドレスへ飛び、あるいは飛び先でのマクロ・ラベルジャン プが不定となるなど、予想できない動作となる可能性があります。 引き金となるのは、多重分岐文でしかも(式)の値が限定的でなく、「}」へ ジャンプする可能性がある場合です。 --- (対策は記事の続きをどうぞ) 常識的には ・無限ループは {} で脱出。 ・多重分岐は数をきちんと数えよ でしょうけれど。 で、「再現しませんよね」で僕が思うのは、高橋さんが、「ループカウンタの 初期化」をするように「バグフィックス」(?)してくれたのではないかしら? 空想です。 じつは、 ; from ygear.def top (s)>?{ >A . >A >A . } . sに5はない。しかし「ゾンビ現象」で、} に実行ポインタが飛んでくる 可能性はなくはない(たぶん)。その場合にも、} のあとの「.」で止まる。 深慮というより習慣なんだろう、とか。 そんな安全策かなと想像していて。 高橋さんの何かで、ゾンビが完全に殲滅されたのだとは、僕は思っていません。 何しろゼロ戦Vzですから。 そして、 (r)>? {.. (a=2,b=3) (a=3,b=4) (a=4,b=5) ...} みたいには書けるのね、と発見。誰もやってないみたいなんですが(僕のvzdef ディレクトリ内)、大丈夫ですよね? この手のことは、ygrepの正規表現&特殊文字では、うまく指定できないの。 すぐGarbled commandとか言うし。 台風です。そろそろ都内で電車がいっぱい止まります。宮崎はどうなったでしょうか?
> >?{ #Y .. * }. *
> 上は、
> >?{ #Y .. * .} *
> これと同じ意味ですよね? なぜ、中カッコの外にピリオドを置くのか?
>5のときは結果も異なります.
>(このコードってどこから?)