html.shd の時にきちんと要望しておくべきものだったのですが, htmlや通常のプログラミング言語のように, キーワードを大文字・小文字どちらでも書くものはいくらもあります。 しかし,現状では stkhelp.def では大小文字を区別して厳密に検索します。 そこで汎用的に使用できる改造方法を考えてみました。 結果は,かなり泥臭い手法になってしまうのですが, .shd 毎の切り出しルーチンで ec を有効とし, 検索時のオプションに \c を加えるというものです。 ec をそのまま変更しても,実際には検索時に無効になってしまうので, どうしても stkhelp のメインルーチンの一部を弄らざるを得ません。 メインルーチンの中に,次のローカルマクロがあります。 04: ; --- キーワードの検索 --- この中のラベル B に次のコードがあります。 :B &Sh(f,g) &10 #F "\i" (fb)?{'c' fb-,} &?(" @%s ",f) #m ; set mp=2 この \i が↑他の検索オプションを無効にしてしまう効果があるようで, ここに明示的に \c を加える必要があります。 #F "\i" (ec)?'c' (fb)?{'c' fb-,} &?(" @%s ",f) #m ; set mp=2 ~~~~~~~~ こうすると,ecがオンであれば,検索文字列の前に「\ic」が挿入され @ キーワードを大小同一視で.shd を走査できるようになります。 このうえで,独自の切り出しルーチンで ec+, としておけばよいことになります。 なお,編集スイッチは Je[, で元々保護してありますから心配ありません。 perl.shd 用の切り出しルーチンはまだ完成していませんが, 最小で次のようになります。 65 "CGI PERL" >> 66 "PL PERL" ?. &29 >78 20: ;大小同一,末尾';' ec+, &f(';',g) (r>0)?g.r-, さて,もう少し何とかしなければですが,使い込んでから拡張でよいでしょう。
めざらさん、おめでとうございます、一歩前進ですね。 うーん、なのですが、> しかし,現状では stkhelp.def では大小文字を区別して厳密に検索します。(0)ここで躓いてしまいました。確かに大文字・小文字同一視が、後述の問題点を 除くと、perl.shd では可能になりました。 問題点とは、 (1) &f(';',g) (r>0)?g.r-,では、どうもperlでの「式の終わり」を意味す る';'をはじいてくれないようである (2) より本質的に、perl.shdでこの同一視が有効であるべきなのか という点です。 (1)は、test.pl 上で、-s, -S(-s; -S;)で確認しました。ファイルテス ト演算子をとるか、コマンドラインオプションをとるか、という選択はあるので すが(僕は前者に傾いています、前と違って)、perl.shd に関していえば、同 一視がないほうがよいのではないかと考えています。perl で大小両方あり、と いうキーワードがありましたっけ? そして、同系統の問題として、 (1)f_call.shdでは同一視ができている(ようだ) ---test.asm--- dx=pr, ax=$3C00, cx-,&i($21) ;ハンドルで作成 dx=pr, ax=$3c00, cx-,&i($21) ;ハンドルで作成 -------------- で確認。(但し、f_call.shd には @3c のキーワードはなく、対象ファイル上 の 3c と 3C を後者に丸めてしまえばよい。そうしているのかは分かりませんけ れど。) (2)sed.shdでは、 ---test.sed--- H h -------------- では、上の大文字でハングってしまいます。無限ループよりひどい感じ。マク ロバッファをずたずたにしているみたい。文字ブロックしてもほぼ同じ。この場 合には、ずたずたにまではしてなさそうですが。 一歩進んだところで、こんなレスで申し訳ないのですが、(0)の部分で、汎 用という願いからいえば、まだ問題が残っているように考えている次第です。 おそらく、このすれ違いは、html.shd を僕が迂回してしまっているからだと 思うのですが、ご考慮いただければ幸いです。
%Title%かも。でも,迷走を自戒するため残しておきます。 うーむ,疲れていたのかなぁ。いくらなんでも視野が狭すぎるわたし。(^^; saki... さんは,ちゃんと大小同一用のフラグを用意してくださっていたのでした。 #F "\i" (ec)?'c' (fb)?{'c' fb-,} &?(" @%s ",f) #m ; set mp=2 --(1)-- ----(2)-------- (1)と(2)は,戻す以外は同じことをやってますよね。なんなんだ,一体。 掲示板書込み時に限らず,その後いくども見てるのに気付かないなんて…。 …というわけで,ec 指定は撤回して, 仕様通りの fb を独自切出しルーチンのローカル 20:で立てることにします。 (0) fb 立てが仕様なので,saki...さんが既に対応済みです。 (1) 「式の終わり」のセミコロンを取り去る件 これ,手元ではきちんとはじいているのです。 転記違いということはありませんか? いろいろアホやってるので,自信がなくなってきましたが, 改めてコードを見る限り問題はないようで…。 テストしていただけるなら以下のようにしてみてトレースしてみてください。 67 "CGI PERL" >> 67 "PL PERL" ?. &29 >78 20: &f(';',g) (r>0)?g.r-, &t &m("%s",g) ;g の文字列を表示 あ,改めて言うまでもないとは思いますが, ローカル 04:のラベル:B は元に戻してください。 (2) より本質的に、perl.shdでこの同一視が有効であるべきなのか おおー,わたしは関数のことしか頭になくて, ファイルテスト演算子やコマンドラインオプションで大小区別が必要であることを すっかり忘れていました。(^^; 大小同一は撤回します。 人様の作られた.pl や.cgi を見ていると, 関数名を大小混在して書く例は見当たりませんでしたので問題ないですね。> (1)f_call.shdでは同一視ができている(ようだ)これは,小文字で書いてあっても大文字に変換しているんです。 ローカルの 26:かな。内部的に十六進数として取得し,再出力してますね。> (2)sed.shdでは、(中略)ハングってしまいます。無限ループよりひどい感じ。これは,そういった要素はないはずなんですけどね。 うーむ,ローカル 04:のラベル:B は元に戻して再度試してみてください。> 一歩進んだところで、こんなレスで申し訳ないのですが、(0)の部分で、汎> 用という願いからいえば、まだ問題が残っているように考えている次第です。いえいえ,既に対応されていたものを読み切れなくてボケたのはわたしです。 曝書中にトシ不相応の作業を連日続け,曝書明けの土日勤務でへとへとになり, 月曜休みのあとは毎日残業(当然残業代は出ません)して,昨日の祝日勤務。 偽病休しっぱなしで給料出ていた奈良の公務員とはえらい違いだなぁ。(笑) 寝床で半分居眠りしながら LX ひろげていても,ろくに進展しないし。 遅々として進みませんが,なにとぞもう少々お付き合いくださいませ。m(_'_)m
めざらさん ありがとうございました。また手数をお掛けしてしまってすいません。> (1) 「式の終わり」のセミコロンを取り去る件> 転記違いということはありませんか?はい、以下の箇所でした。> テストしていただけるなら以下のようにしてみてトレースしてみてください。ばっちりです。 67 "PL PERL" ?. &29 >78 ;ここが77でした。>> (2)sed.shdでは、(中略)ハングってしまいます。無限ループよりひどい感じ。> これは,そういった要素はないはずなんですけどね。>うーむ,ローカル 04:のラベル:B は元に戻して再度試してみてください。いえいえ、今回のめざらさんの改造(スレッド消去?)とは無関係に起こって います。おそらく v1.60 β 11 からのものだと思うのですが…。 よろしければ、一度、 ---test.sed--- H h -------------- 上で、試していただけませんでしょうか。H で無限ループだと思いますので、注 意して。 以下のように★行を追加してトレースして追っかけたのですが、 33: ;--- メニューor表示項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ &d&t &m("%s",g) ;g の文字列を表示★ #> #d ;何してるのでしょう?see ◆ (cd)>!{ @ >Z (';') >^ ($0D) >^ } &35 >^ 35: ;--- ;--> ; csr : find line top ; x : work bufer ;<-- ; (x) : menu str ($ convert) ; l : str length (after convert) ; b,q,i ; #b #> ps=x,#G l=r,ps=g, &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r, ;#ESC+ (fi)?. r+=x, :L (r-x>1)?{ ; 先頭の $ はエスケープしない (r--.0!='$')?>L ;■このあたり r[,&SF("PA",r.1) (r) r],?>L ;■で無限ループ (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+, ;■していると思う。 ◆何をしているのか ------------------------------ @H_ @H バッファ H ホールドスペースにアペンド (2 hold) ------------------------------ これが sed.shd 該当部分です。#>#d で「バッファ」の行を取得するのは分か る(1)。更に「H ホールドスペースに」も #G で取得しています(2)。これ が正常動作なんでしょうか。 (1)はメニューを作るのに必要ですよね。 (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて しまう .shd の書式(文法)は、辛い経験から知るにいたっています。でも、こ こで、両方取得するのでしょうか。 もっと本質的には、 2つ取得するとして、そのあと L ラベルでどうして無限 ループするのか? こんなところです。再現しないと通じないのですが。 また、perl.shd の話から逸れて(それのもっとも本質的な問題は、$ を含む キーワードだったはず)しまい、申し訳ありませんが。>>(1)f_call.shd では同一視ができている(ようだ)> これは,小文字で書いてあっても大文字に変換しているんです。> ローカルの 26: かな。内部的に十六進数として取得し,再出力してますね。お教えありがとうございました。> いえいえ,既に対応されていたものを読み切れなくてボケたのはわたしです。>曝書中にトシ不相応の作業を連日続け,曝書明けの土日勤務でへとへとになり,「ばくしょ」。やはりバグ避け(笑)に陽に晒すわけですか。 青ラクダが絶版とのことで、いよいよ図書館のお世話になります。でも、そん な(ちょっと口はばったいけど)良心的な図書館員さんのお陰でちゃんと本が読 めるので、ありがたいです。でも、お体は大切に。「労働者よ団結せよ」ではぜ んぜん解決しない問題が、常に現場にはありますからね。(こんな言葉遣いをし たらクビにされそうだ)
> ◆何をしているのか
> 更に「H ホールドスペースに」も #G で取得しています(2)。
> (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて
> また、perl.shd の話から逸れて(それのもっとも本質的な問題は、$ を含む
> キーワードだったはず)しまい、申し訳ありませんが。
めざらさん 今日はまとまった時間が取れそうもないので、とりあえず試行錯誤なしのレス で失礼します。> セミコロンの件,ほっとしました。すいませんでした。僕も間違いが見つかりほっとしました。助かりました。> で,無限ループの件ですが,うちではそのような現象は出ていないんです。あらら。そうですか、stkhekp.defでなく、sed.shdに問題がありそうなんです ね。うーん。大して変化してないはずなんだけど…。参ったなぁ。> 文太版の sed.shd を見ると,わたしもよくは解らないのですが,> 微妙に .shd の書式と異なるように思ったりもするのですが…。> 手元にある 2004/11/18の版では特に問題ありませんでしたが,> その後,文太さんの手元でバージョンを上げる過程で発生とか。了解です。 まずsed.shdを過去に戻りながら試してみます。ありがとうござい ました。> なお,無限ループを疑われているローカル 35:ラベル:L ですが,(中略)> メモリのスキャンなので通常はあまり時間はかかっていません。了解。根性でトレースしてみます。> > ◆何をしているのか> 動的メニューで表示するためのアイテムを取得して,> メニュー中で化けそうな $ があればエスケープ処理しています。かたじけないです。> トップメニューからグループ項目を選択した場合の動作です。> このときグループ項目は各項目を取得するために検索するだけで,> 取得はしていません。あり? これが変だぞ。>> 更に「H ホールドスペースに」も #G で取得しています(2)。>> (2) は、ここにキーワードと同じ文字「H」を入れないとメニューが乱れて>> メニューが乱れるというのはよくわかりませんが,>メニュータイトルに表示されているのはグループ項目なので,>キーワードを入れずに意味だけ入れても何のことか不明な時があるでしょう。>例えば,トップメニューから下位メニューをたどっていった場合などです。ここはですね、確かにご指摘のとおり「人間に意味が分からない」ということ もありますが、メニュー遡りが効かない、という困った副作用もあるはずだと思 っています。> あと,参照項目を選択してジャンプする時に必要だったりするでしょうか。ジャンプはリンクがあればできたと思いますが、 そうでない場合、 いったん stkhelpを終了しないと身動きできなくなると思いますが…。> 特別切出しルーチンを作る過程で考えていけばよいかと思います。> 作るだけ作って動作はあまり確認していないの。(^^;> だって,まだ perl のスクリプトを書くことに本腰で取り組んでいませんから。ですね。スクリプトがなくてshdを作るのは、やはり大変。 気分転換に、遊びのperlスクリプトを写しましょう。でも面白いのがなくて。 そうそう、いちおうperl用切り出しルーチンについていえば、(?!> みたいなの を切らないまま検索したいですね。忘れないように書いておいているだけです。 m(__)m
めざらさん いちおう確認だけさせていただいて宜しいでしょうか。 大した追跡調査をしていないのですが、stkhelp β8とβ11での比較実験か ら入ったら、β8だと問題なく sed.shd 最新版が動くのです。参ったな、とい うところなんです。 で、無限ループが再現しなかったの stkhelp はβ11ですよね。そして sed. shd は 2004/11/18 のほとんど初版ですよね。 たぶん再現しないのは、そのあたりの違いによるものだろうと思っているわけ です。> 文太版の sed.shd を見ると,わたしもよくは解らないのですが,> 微妙に .shd の書式と異なるように思ったりもするのですが…。で、この「微妙な書式の違い」は、どこでそう思われましたでしょうか。 宜しければお教えください。
めざらさん sed.shd 2004/11/01 + stkhelp β11では確かに再現しませんでした。 しかし、sed.shd 2006/09/08 + stkhelp β11ではきっと再現し、 sed.shd 2006/09/08 + stkhelp β8では再現しません。 最悪の組み合わせみたいです…。とほほ。書式の違いですぐ僕が気づいたのは、 sed.shd 2004/11/01 では @h_ @H_ @h @H バッファ h / H ホールドスペースへの保持(hold) h パターンスペースの内容をホールドスペースに上書きで複写する。 H パターンスペースの内容をホールドスペースに追加で複写する。 と大小がそもそも sed.shd で区別されていないという点です。他に何か気づか れましたでしょうか。
めざらさん ほんと他力本願モードで申し訳ありませんが、β8とβ11では、例の該当個 所のコード及びロジックが違っていますね。sed.shd のフォーマットエラーとい うより(その可能性はまだ十分ありますが)、ここがネックなんだろう、とまで 詰めました(大した進歩でなくて残念ですが)。 β11では、$の扱いの仕様が変わっているのですから、$をスキャンしてい る、ローカル 33:, 34:, 35: のコードが変わっているのは当たり前なのですが、 読み切れますでしょうか。 &35 は、33 と 34 から呼ばれていますので、β11で共通部分を外に出して いるのだと思います。それでも追加された部分で、前になかった .shd のフォー マット制限が厳しくなっていると思います。 とりわけ、「(l+b<q) だとハング」の saki. さんメモが気になるのですが。 これは安直すぎなのかもしれないですが。切り出す時点でHだけの行が短すぎる のが原因か、とか空想したのですが。 β8 33: ;--- メニューor表示項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ #> #d (cd)>!{ @ >Z (';') >^ ($0D) >^ } #b #> #G l=r, &SF(x,9) (r)?r-=x,?r=l,(cd=='$')?r-=3,(r>w)?w=r, &Ss(x) ; &Ss(x) 後が次の文字なら &f(r.0,"#>&") (r<0)?>N ; バッファ x 先頭に 3 bytes 挿入 (r)?{(fa)fa-,?r1,?r2,} ; # : 先頭に "$aa" &Sm(x+3,x,l+1) x..0='a$', x.2=c.r, ; >,& : 1回目 "$ag" l+=3, ; 2回目以降 "$au" :N (l<q-b)??. ; アドレス演算て面倒(^^;;) … (l+b<q) だとハング &Sc(b,x,l) b=r+1,q-=2,i++, >^ :Z (0) ------------------------------------------------------------------- すいません、たぶん最初からだと思うのですがβ8とβ11で4タブ、8タブ の違いがあり、それを直してはいません。 ------------------------------------------------------------------- β11 33: ;--- メニューor表示項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ #> #d (cd)>!{ @ >Z (';') >^ ($0D) >^ } &35 >^ :Z (0) 34: ;--- グループ項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ #> #d (cd)>!{ (';') >^ ($0D) >^ } &35 #c (r)?. ; return (0) >^ 35: ;--- ;--> ; csr : find line top ; x : work bufer ;<-- ; (x) : menu str ($ convert) ; l : str length (after convert) ; b,q,i ; #b #> ps=x,#G l=r,ps=g, &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r, ;#ESC+ (fi)?. r+=x, :L (r-x>1)?{ ; 先頭の $ はエスケープしない (r--.0!='$')?>L r[,&SF("PA",r.1) (r) r],?>L (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+, } ;# (t==2)?>N &Ss(x) ; &Ss(x) 後が次の文字なら &f(r.0,"#>&") (r<0)?{(l<x..-1)??fy+,>N} ; x 先頭に 3 bytes 挿入 (l+3<x..-1)??{fy+,>N} (r)?{(fa)fa-,?r1,?r2,} ; # : 先頭に "$aa" &Sm(x+3,x,l+1) x..0='a$',x.2=c.r, ; >,& : 1回目 "$au" l+=3, ; 2回目以降 "$ag" :N (l<q-b)??{&q(1).} ; need unsigned b,q (l+b<q) だとハング &Sc(b,x,l) b=r+1,q-=2,i++,
めざらさん ああ、またスイッチを間違えた。スペースが飛んでしまって申し訳ありません。 これで4・8タブ障害が緩和されてくれるといいのですが。
めざらさん 何度も何度もすいません。 例の無限ループよりひどい事態が起こったときには(すでに書いた条件でほぼ 間違いなく再現する。 β11と最新 sed.shd の組み合わせ)、間違いなくマク ロバッファをズタズタにしています。3回試して、vp.81 のコード近辺で無限ル ープしていたのですが、stkhelp には、vp.81 のコードがありませんでした。vp. 81 のコードがどこから来ているのかは調べていませんが、これは僕の環境に依 存しているはずなので、調査資料としてさえ意味がないでしょう。こんなところ です。やれやれ。
> 僕の環境に依存しているはずなので、調査資料としてさえ意味がないでしょう。
めざらさん どうぞごゆっくりなさってくださいね。 確かに怒涛は怒涛ですが、1時間かそこいらしかもがいてないんですよ(前史 があるといえばそうかもしれませんが)。深みにはまって「何なのよ」から脱せ なくてなって次々発言を上げてしまったのです。騒々しくすいませんでした。 で、これですね。vz.def 内のグローバル 36 番です。はい、検索ヒット文字 列色付けマクロ by 和生さんですね。でも、β8も11も 36 は呼んでないんだ けど…。どうしてここへ飛んでるのでしょう???&q ??? 36 \[DOWN] "" c#c, ;#36 :a (s)?. &d &o(c) (r||mb||mp-2)?. ;(mp==2)?#M (vp.81==40)?>03 ;\fx (vp.81&$20)?{ &00 ?>b ?>03 } ;\f, #ifn VZt03i~ schf=0 (vp.82&$80)?{ &01 ?>b ?>03 } ;\x,\z (wait t_vu) cx=vp..36, ;others (r||mb||mp-2)?.とか、すごく見覚えありますねぇ。不幸な記憶。 stkhelpが弄られている可能性はほとんどないと思うのですが。 触れませんも の。少なくとも11は昨晩落とし直していますし。8は不具合(?)再現しませ んし。
> 見えてきたのは,文太さんの stkhelp.def がオリジナルと異なる可能性です。
> 08320/08320 HFD01703 saki... Re:STKhelpと大小英字キーワード
> (14) 04/11/07 09:02 08319へのコメント
> 記事No: 1262
> 投稿日: 2006/11/01(Wed) 06:05
>
> どうも簡単にはいかないみたいです。(^^;
> 検索でヒットしないと,.shd 開いたままブレイクしたりするんですよ。
> プッシュしたものをポップできずにブレイクなので,その都度whip。
めざらさん 灯台もと暗し。 --- vz.def --- 35 \[UP] "" c#r, >a ;#35 36 \[DOWN] "" c#c,;#36 -------------- この 35 をサーチしていました。 そして 36 のラベル a へと突き進んでいま した。 はたして、 この件とプッシュ・ポップが戻らないで「Buffer overflow」にな る件が直接に関係しているか分かりませんが、分かったことを書いておきます。 例のsed.shd不具合発現項目は、 ----------------------------------------------------------------- @H_ @H バッファ H ホールドスペースにアペンド (2 hold) H パターンスペースの内容をホールドスペースに追加でコピーする。 ex. Sed -e $"/./{H;$$!d;}$" -e $"x;/AAA/!d;$" ***ここ接続*** (paragraph grep w/ "AAA"; blank line sep.) > G ホールドスペース内容のアペンド > x バッファ内容の交換 ----------------------------------------------------------------- のようになっていて、「*** ここ接続 ***」が繋がっており、行が長すぎた、 ということのようです(切ったら再現しなくなりました)。 stkhelp でいうと、ローカル 35 の L ラベルの永遠とも思えるスキャンのの ち(トレースですから)、ラベル N へ行って(◆2 のところでたぶんネストレ ベルを間違って計算し)、33 に戻ってきます。 このとき、カーソルは「長すぎ た行」の上にあって、#> #d によりリンク行におります。ここで多重分岐のあと、 &35 というわけです。 めざらさんご推察のとおり、この 35 のサーチがマクロバ ッファの先頭から行われ、vz.def 内の例の和生マクロで訳分からなくなる、と いう具合のようです。 stkhelp には、 (fy)?{r="Line overflow!(SHD の行を分割して短くして下さい)",>Q} というところがあるのですが、これをかわしてしまって、《なぜか》転ぶとい う結果になるという具合です。《なぜか》といっても、ネストレベルを間違えた ら、目的の網にかからなくても仕方ないのでしょうが。(後述:◆3は???) これで、少しでも本質的な向上に力添えができるといいのですが。 (もちろん、以下はβ11) 33: ;--- メニューor表示項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ ; &d&t &m("%s",g) ;g の文字列を表示★ #> #d (cd)>!{ ;◆1 @ >Z (';') >^ ($0D) >^ } &35 ;★boom!!! >^ :Z (0) 34: ;--- グループ項目スキャン --- &m("%c",d..(i&3)) ;#DISPLAY+ #> #d (cd)>!{ (';') >^ ($0D) >^ } &35 #c (r)?. ; return (0) >^ 35: ;--- ;--> ; csr : find line top ; x : work bufer ;<-- ; (x) : menu str ($ convert) ; l : str length (after convert) ; b,q,i ; &d&t &m("%s",g) ;g の文字列を表示★ #b #> ps=x,#G l=r,ps=g, &SF(x,9) (r)?r-=x,?r=l,(r>w)?w=r, ;#ESC+ (fi)?. r+=x, :L (r-x>1)?{ ; 先頭の $ はエスケープしない (r--.0!='$')?>L r[,&SF("PA",r.1) (r) r],?>L (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+, ;◆3あ、ここにfy+が! } ;でも効いてないと思う。 ;# (t==2)?>N &Ss(x) ; &Ss(x) 後が次の文字なら &f(r.0,"#>&") (r<0)?{(l<x..-1)??fy+,>N} ; x 先頭に 3 bytes 挿入 (l+3<x..-1)??{fy+,>N} (r)?{(fa)fa-,?r1,?r2,} ; # : 先頭に "$aa" &Sm(x+3,x,l+1) x..0='a$',x.2=c.r, ; >,& : 1回目 "$au" l+=3, ; 2回目以降 "$ag" :N (l<q-b)??{&q(1).} ; need unsigned b,q (l+b<q) だとハング &Sc(b,x,l) b=r+1,q-=2,i++, ;◆2
めざらさん 自分の発言を読んでいて、もう一歩詰められると思いました。 35: ;--- (中略) :N (l<q-b)??{【&t&d】 &q(1).} ; need unsigned b,q (l+b<q) だとハング▲1 &Sc(b,x,l) b=r+1,q-=2,i++, 【&t&d】 ;▲2 ここで、「ほんとうに &q のところなのか?」と。それなら調べられると思っ たわけです。 いえ、▲2 でした。するとどこでずれたのか、分かりませんが。 うーん、 &q って引数取るのですかねぇ? ローカルの返り値なのだとしても、 意味あるのかなぁ???
めざらさん> ともかく,一「見」落着ってことで。(マクロコールの謎は残るけど)了解です。
めざらさん メールありがとうございました。ちと難物すぎますかね。 mg..2 がころころ変わり、示す先がポインタで、これを q でいじってるみた いだとなると、まず僕では無理だな、とだけは思ってました。 和生さんがVzのマクロ管理(モジュールの壁は突き破るものではなく、壁の 内側に入るんだよ=ワープとか)を丁寧に丁寧の教えようとしてくれたことを思 い出して。ヒットブロック着色マクロから、おい、変なところで繋がるなよ、何 かの縁? とか。ちょびっとはもがきましたが、あはは。q、読めませんね。 「馬鹿、q だけ調べるデバックプリント入れてうまくいく場合、うまくいかな い場合の状態ぐらいは調べられたろう」と今日通勤電車の中で突然思い出しては いたのですが。 また、&q(1). は、あはははは、おほほほほの間違いでした。&q で . と同じ くリターンしてしまうと思っていたのでした。失礼しました。
また忘れた。 これを書こうと思っていたのに。というわけで、&q に問題があ るわけではないのだろうと思っています。なのでタイトル変えました。 vzmacro.shdを編纂するところからして、stkhelpは、Vz読み切ってるんです。 なんだけど、汎用一歩手前で今のところ終わってしまってる。メンテナーもいない。 Jperlの最大の問題点も、同じくメンテナーがいないことなんです。捨て子のマクロ の話みたいですね。
確かに &q に問題はありませんでした。 おおむね原因が分かりましたので,暫定的修正を施してみました。 後で,この件について saki... さんに報告しておきます。 問題は,$ 以下を1バイトずらして複写する時のサイズでした。 60%付近のローカル35,原版では次のようになっている箇所です。 ;#ESC+ (fi)?. r+=x, :L (r-x>1)?{ ; 先頭の $ はエスケープしない (r--.0!='$')?>L r[,&SF("PA",r.1) (r) r],?>L ; (l+1<x..-1)?{&Sm(r+1,r,l++) >L}?fy+, ;★org (l+1<x..-1)?{&Sm(r+1,r,x+l++-r) >L}?fy+, ;☆20061112 j1 } ;# ★が元のコードで,取得した行の長さ分を1バイト先に複写しています。 x r A B ─┬───────────────┬──────────┬──── │取得した文字列 $ │ バッファ余白 │次のマクロ ─┴───────────────┴──────────┴──── ↑ $ の位置 は r ←──────────────→ 変数 l が示す取得した行の長さ ←─→ 複写すべき長さ(r〜A長 == x+l-r) ←──────────────→ 複写される長さ(x〜A長 == l) $が取得文字列の後ろの方にあると,「B」から始まる次のマクロの先頭を 破壊します。その結果,stkhelp.def はその位置から後ろがごっそり切り捨て られ,以降にあるマクロにアクセスできなくなります。 切り捨てられた部分にあったマクロは見つからなくなり,マクロバッファの 先頭からマクロ番号が検索されます。そしてマクロの動作は不定になります。 無限ループになった理由は,先頭から探した35番マクロに #r があったから でしょう。わたしの VZ.DEF にあるマクロは #r を拡張するマクロで, #r コマンド番号である 35番と同じ番号を割り当ててありました。 このときの #r の動作は検索モードで取得キーワードの戻り検索になります。 そのためグループ項目名の取得を永遠に続けることになります。 ☆の暫定的修正は,$の位置から文字列の末尾までの文字数分に限定して 複写するというものです。> なのでタイトル変えました。ご配慮に感謝します。原因がわかるまでは,どこかに呼出元を操作する カラクリがあるかと推測していましたが,完全に外してました。> なんだけど、汎用一歩手前で今のところ終わってしまってる。メンテナーもいない。saki...さんに連絡を取りますよ。作者のメンテナンスなら安心ですから。 で,十分汎用性はあると思いますよ。切出しルーチンさえ作れば,大抵の キーワードに対応できるわけですから,要はスキルが問題ということだけど。
祝! 祝! 祝! 祝! めざらさん、祝! 祝! 祝! 祝! 以下、一番ご苦労されたところ、そして詳しい解説をカットしてしまってすい ませんが、いやあん、うーん、マクロ師、コワイ、って感じです。 とにかく、よかった。> おおむね原因が分かりましたので,暫定的修正を施してみました。しつこいけど、ヤッタ。> 問題は,$ 以下を1バイトずらして複写する時のサイズでした。ここは読めません(過去形でもない)。何をやっているのやら、でした。l と か x とか。> このときの #r の動作は検索モードで取得キーワードの戻り検索になります。> そのためグループ項目名の取得を永遠に続けることになります。おお、無限ループ問題カイケツ! カイカーン。> ☆の暫定的修正は,$の位置から文字列の末尾までの文字数分に限定して> 複写するというものです。まさしく! とか、とか。 テストの結果は良好です! \(^_^)/> 原因がわかるまでは,どこかに呼出元を操作する> カラクリがあるかと推測していましたが,完全に外してました。僭越ですが、僕も同じことを…。なんてね。> saki...さんに連絡を取りますよ。作者のメンテナンスなら安心ですから。少しくらい子供のことを思い出してもらえればいいのですが。> で,十分汎用性はあると思いますよ。切出しルーチンさえ作れば,大抵の> キーワードに対応できるわけですから,要はスキルが問題ということだけど。そのスキルが問題なんですよ。 それでも、 今回のことのおかげで、 少しは stkhelp 全体についても、切り出しルーチンについても理解が深まりました。';' のヌルカットで、おお、そうやるのか、と。 多謝でありまする。m(_B_)m