新着記事

− 野ざらし言 −

新規投稿は記事一覧のフォームからお願いします

[5861] Re^5: 果樹・果実 2025 (桃)

めざら 2025/05/10(Sat) 08:04
[関連記事] [5739]へのコメント
http://mezala.la.coocan.jp/
なんと! 結実しつつあるので,欲が出てしまって少し摘果しました。

苗がまだ貧弱なので,負担をかけないように経過観察しようかと思います。

[5860] Re: 種蒔・栽培 2025 (モロッコ隠元)

めざら 2025/05/10(Sat) 07:55
[関連記事] [5725]へのコメント
http://mezala.la.coocan.jp/
モロッコ隠元を蒔きました。

幅広で短めの畝を作り,端に沿って二列蒔きするかたちです。

発芽したら,二本の支柱を斜めに立てて頂部で交差させ,ネットを張って両側から誘引することを考えています。

ひと袋すべて蒔ききり,うまくやれば採種できるかも。
以前はよくこぼれ種が発芽してくれたのですが,ここ数年はいい種ができてくれません。たぶん莢で収穫しきってしまうから。(笑)

[5859] Re^28: N88-BASICのRENUMのようなマクロ

めざら 2025/05/09(Fri) 08:12
[関連記事] [5858]へのコメント
http://mezala.la.coocan.jp/
#U で参照される位置情報(マーク0)は,#^(先頭行へのジャンプ) や #F(検索文字列の設定) といったコマンド等で簡単に書き換わってしまうので,注意が必要です。

状況にもよりますが,できれば,マーク1~4 を使うか,4バイトのバッファを用意してすり替えるのが吉かと。

[5858] Re^27: N88-BASICのRENUMのようなマクロ

としき 2025/05/09(Fri) 00:12
[関連記事] [5857]へのコメント
http://toshiki.la.coocan.jp/
> > #rとか#cの場合、検索して発見できた、または発見できなかったという結果は
> r に返ってきます。

あぁ、そう、r に返ってくるのね。

> ■内部レジスタ
> (式)で評価した値が内部レジスタに格納される。

ここらあたりがねぇ、なかなかピンと来ないというか府に落ちないというか。

とりあえず、今やろうとしている改良版の作成では、#U を使うか使わないか、みたいな感じで動いています。が、全く関係ないロジックに化けそうな気配も、そこはかとなく漂っていたりして。

[5857] Re^26: N88-BASICのRENUMのようなマクロ

めざら 2025/05/08(Thu) 08:06
[関連記事] [5856]へのコメント
http://mezala.la.coocan.jp/
■内部レジスタ
(式)で評価した値が内部レジスタに格納される。
特殊な例としては,グローバルマクロの実行開始時に,システムモード(s)の値が内部レジスタに格納される。
(編集モード専用マクロの冒頭に ?. と記載するお約束に関係する)

■戻り値(r)
コマンドを実行した結果の戻り値が r 格納される。
ローカルマクロから呼出し元に戻るときに,内部レジスタの値が r に格納される。
メニューで選択されたアイテムの番号(先頭が0)が r に格納される。

なお,関数やコマンド関数にも,戻り値があるものがある。破壊(不定)するものもある。

ざっくりまとめると,こんな感じでしょうか。(細かいツッコミどころあり)


> #rとか#cの場合、検索して発見できた、または発見できなかったという結果は

r に返ってきます。
内部レジスタに値が格納されるのは (式) の評価だけ。
内部レジスタを参照するのは ? だけ。
(グローバルマクロ実行時に (s) を実行している,?で論理NOTされる……と覚える。)

[5856] Re^25: N88-BASICのRENUMのようなマクロ

としき 2025/05/07(Wed) 23:59
[関連記事] [5855]へのコメント
http://toshiki.la.coocan.jp/
> 戻り値(r)と内部レジスタを混同しないようにしましょう。

これこれ。これが私のわかっていないところ。現在絶賛混同中。
さてそこで。

> あくまでも全置換の直後の r に置換した数が格納されるということしか分かりません。

話を次に進めて、全置換ではなく単純な検索の場合。
#rとか#cの場合、検索して発見できた、または発見できなかったという結果はrに返ってくる、ということでよろしいでしょうか。それとも内部レジスタに返ってくるのでしょうか。なんとなく、内部での動作の結果なので、イメージ的には内部レジスタに返ってくるような気がします。もしこれが違うとなると、私の思うところの「内部」と実際が異なっているということで、やっぱり足元がおぼつかないというかめまいを感じてしまいそう。

[5855] Re^24: N88-BASICのRENUMのようなマクロ

めざら 2025/05/06(Tue) 22:36
[関連記事] [5854]へのコメント
http://mezala.la.coocan.jp/
あくまでも全置換の直後の r に置換した数が格納されるということしか分かりません。途中の戻り値については,ちょっと保証できないです。実験上は一定の値が示されているようにも思いますが,どこにも記述は見つからないので,断言はできません。

なお,戻り値(r)と内部レジスタは混同されやすいのですが,条件分岐で参照されるのは内部レジスタであって r ではありません。

また,「?」は内部レジスタを反転(論理NOT)しつつ,内部レジスタが偽(0)だった場合は次の1命令または1ブロックをスキップするという働きをするキーワードです。

内部レジスタに値が格納されるのは(式)で評価した場合であり,rは直接関係ありません。
例えば,(r==0) ? { A } ? { B } という構文であれば,rが0のときに条件式は真なのでブロックAが実行され,ブロックBはスキップされます。

大事なことなので二度言います。
戻り値(r)と内部レジスタを混同しないようにしましょう。

ちなみに,コールしたマクロから戻る時に,終了時の内部レジスタをrに格納して呼出し元に戻るという機能があるので,そのへんがさらに混乱を誘うのかもしれません。逆に言うと,サブルーチンの戻り値に規則性を持たせる記述ができるわけです。このこともセットで覚えておくとよいと思います。

[5854] Re^23: N88-BASICのRENUMのようなマクロ

としき 2025/05/06(Tue) 18:50
[関連記事] [5849]へのコメント
http://toshiki.la.coocan.jp/
> 置換数は実行後の戻り値(r)で確認できます。#56 #57 同じ。

えと、何か精神的に不安定になっているので確認させてください。
全置換ではない置換の場合、あるいは検索の場合、対象が発見できたとき、すなわち成功の場合にはr==0ということでいいのですよね。って、instant.defで見た限りではそうなっているようですが。
そして、Vzマクロの条件判定に使う「?」では、r==0の場合に、次のコマンドなりジャンプなりブロックをスキップ、ということですよね。

なんか、めまいするような感覚にとらわれている。
どこか私が間違っているに違いない。

[5853] Re^26: N88-BASICのRENUMのようなマクロ

めざら 2025/05/04(Sun) 07:54
[関連記事] [5852]へのコメント
http://mezala.la.coocan.jp/
> 知りたかったのは、8000h 以上の値を返してくることはあるのか、ということ

お察しのとおり,単純に返してきますね。
ログファイルみたいな大きなファイルを対象にして……
RX[+, #56 "\(.\)" #m "\1" #m "ay" RX],
……なんかを実行してみると,83,886バイトの日本語まじりの文書で「61013 個の文字列を置換しました」というメッセージが表示されました。
ものは試し,ということで,116,661バイトの文書で実行したら「18048」。
要するに,ワードのサイズに収まらなければ,丸められるって感じ。

そこを心配しても,そういうことだから意味はないかと。
キャリーフラグでも立てば,何らかの手はあるのでしょうが,ないな,きっと。

[5852] Re^25: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 23:02
[関連記事] [5851]へのコメント
http://toshiki.la.coocan.jp/
> 知ってて敢えて質問していません? いけずやなぁ……

いや、そうではなくて、質問の仕方を間違えたというか。
知りたかったのは、8000h 以上の値を返してくることはあるのか、ということだったのです。ただ、FFFFH以上の置換というのもありうるわけですから、当然、単純に返してきそうな気がする。むしろ、2バイトに収まらない回数の場合を心配するべきだったか。

[5851] Re^24: N88-BASICのRENUMのようなマクロ

めざら 2025/05/03(Sat) 20:21
[関連記事] [5850]へのコメント
http://mezala.la.coocan.jp/
> 置換数の最大値って、符号付きで返ってくるのですか?

変数 r に収まる値ということになると思いますが,符号付きかどうかは取出し方に依存するのではないでしょうか?

16ビットなので,7FFFh(32767) 以下なら符号なしでもありでも同じですが,8000h 以上になると,符号ありなら -32768 〜 -1,符号なしなら 32768 〜 65535 かと。

まぁ,符号云々にかかわらず,置換数が負になることはありえませんから,符号を気にすること自体が意味を持たないでしょうね。

知ってて敢えて質問していません? いけずやなぁ……

[5850] Re^23: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 16:58
[関連記事] [5849]へのコメント
http://toshiki.la.coocan.jp/
> v1.6 のマニュアル類には記載が見つからないようですね。

なんだ、見つけられないのが正解だったのか。ちょっとほっとしました。

ということで、これから高速化を試してみましょう。
いろいろやっているうちに、置換数を使わないロジックを思いつくかも。

そうだ、高速化の反対の遅速化というか。
試してみればわかる話ではありますが、試すのが怖いのできいてしまいます。
とんでもない量の置換が行われるときって、当然、とっても遅くなるわけですが、置換数の最大値って、符号付きで返ってくるのですか?
それとも符号なし?

[5849] Re^22: N88-BASICのRENUMのようなマクロ

めざら 2025/05/03(Sat) 13:06
[関連記事] [5848]へのコメント
http://mezala.la.coocan.jp/
> 全置換の場合、置換回数が取得できると思いましたが、

v1.6 のマニュアル類には記載が見つからないようですね。

v1.5 時代に刊行された解説書には記載があるので,v1.5 のマニュアルには記載があるのかもしれません。

置換数は実行後の戻り値(r)で確認できます。#56 #57 同じ。

例えば,すべての空行を削除する場合は,これを利用して,次のように戻り値が 0 になるまで繰り返すという手順をとることができます。

#56 "\n\n" #m "\n" #m "ay"
(-1){ #57 (r)??{} } ;置換数が0になるまで繰り返し

[5848] Re^21: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 11:35
[関連記事] [5847]へのコメント
http://toshiki.la.coocan.jp/
> > プッシュの行がコメントになっていると、異常動作の確率が圧倒的に高い。
> プッシュをせずにポップだけ行っていたら,動作が異常になるのは必然です。

なるほど。
スタックポインタがどんどんずれていってしまうわけですね。
で、ずれた結果、たまたまうまく動かない値が継続している部分なのか、うまく動く値が散在している部分かで不調になる確率が異なっていた、と。よくわかりました。逆にこれ、たまたまうまく動く値の部分にずれているようなら、当分の間は気づけなかった可能性もあるわけで、それも怖い。

謎が解けたところで、いよいよ高速化かな。
そこで一つ教えてください。
全置換の場合、置換回数が取得できると思いましたが、これってどうやるんでしたっけ?
また、この回数の取得って黒本のどこに載っています?
索引を見ても探せないのですが、黒本には載っていないのかな。
.docのほう?
あれ、3つの.docを見ても見つからない。
うぁ、私の検索能力が落ちているっぽい。

[5847] Re^20: N88-BASICのRENUMのようなマクロ

めざら 2025/05/03(Sat) 10:18
[関連記事] [5846]へのコメント
http://mezala.la.coocan.jp/
> プッシュの行がコメントになっていると、異常動作の確率が圧倒的に高い。

プッシュをせずにポップだけ行っていたら,動作が異常になるのは必然です。
異常がみられなかったとしたら,運がよいだけで,たまたまですね。
特に,履歴バッファの先頭を指すアドレスなどが絡んだ場合,破滅的なことにも。

プッシュ/ポップで使うマクロスタック・ポインタ(sp)は使うたびにずれていきます。便宜的に起動時の sp が指すアドレスを p とすると,1回目のプッシュで p-2 に移動し,2回目のプッシュで p-4 に移動します。
1回目のポップで p-2 に戻り,2回目のポップで p に戻ります。

さて,プッシュせずにポップだけ行ったとすると,1回目のポップで変数に戻ってくる値は p にある値で,sp の指すアドレスは p+2 になります。2回目のポップで p+2 にある値が参照され sp は p+4 になります。そこはまったく別の用途のバッファですから,どんな値が潜んでいるのかわかりません。でも VZ はユーザーが指示するとおり,中身を確認することなく愚直に指示されたアドレスの値を棚から運んできて,元の引出しに戻します。

たとえは悪いですが,薬剤師がヤブ医師の処方箋どおりに薬を渡すだけの存在だったらどうなるのか……みたいなことになると思います。

[5846] Re^19: N88-BASICのRENUMのようなマクロ

としき 2025/05/01(Thu) 00:44
[関連記事] [5845]へのコメント
http://toshiki.la.coocan.jp/
> プッシュの行がコメントになっているために ps のアドレスが

ここは、&sをコメントしようとして間違えたものです。
さて。

> 短いサンプルに対して実行したところ,正常に動いています。

昨日は安定して不調だったのに、今日は不安定。
ときどき異常動作、という感じ。そして再現性がない。
とはいえ、ひとつわかったこともあって。
なにかというと、上記の、プッシュの行がコメントになっていると、異常動作の確率が圧倒的に高い。でも、安定して異常動作、というわけでもないのが不思議。
何か手がかりがないかとinstant.defでmpの値を見たら、なんと14850などという値になっておる。おそらく、このせいだと思います。なんでそんな値になっていたかは不明ですが。

さて、いろいろとやっているうちに、#5753なら大丈夫だけど#5842だとダメ、というパターンに気がつきました。具体的には、GOTOなどの前が空白ではない場合。そんな事はないだろうと思っていたのですが、実はあったのです。どんなときかというと、マルチステートメントの場合。この場合は、空白ではなくコロンが前置されます。うむ、正規表現に1文字追加するぐらいだからそれほど大変でもないな。ただ、最大の課題として、実行速度のほうをもっと何とかしたい。
実は、実行速度を多少は改善できそうなアイディアは思いついたのですが、実際にそれをコーディングできるかは謎。Vzのマクロを隅々まで把握していませんから。
もし自力解決できないようなら、また質問させていただきます。

[5845] Re^18: N88-BASICのRENUMのようなマクロ

めざら 2025/04/30(Wed) 07:43
[関連記事] [5844]へのコメント
http://mezala.la.coocan.jp/
短いサンプルに対して実行したところ,正常に動いています。

100 IF A=B THEN 110 ELSE 120
110 GOTO 200
120 GOSUB   130:END
130 REM SUBROUTINE

……のように,行末でない場合も正しく変換されているようです。

はじめ,「最初の置換」と「次の置換」の意味を,
マクロをリロードすることなく実行すると正常ではなくなる
……のことだと思い込み,

;mp[=2, ps[=pa, RX[+,
RX], ps], mp],

プッシュの行がコメントになっているために ps のアドレスが
入れ替わってしまうための不具合だと早とちりしたのですが,
さすがにそんなことではないですよね。

トレースしてみたのですが,(結果が正常なのだから)わからず。

[5844] Re^17: N88-BASICのRENUMのようなマクロ

としき 2025/04/29(Tue) 23:46
[関連記事] [5843]へのコメント
http://toshiki.la.coocan.jp/
> 手元で動作を確認してみたいので,サンプルの処理対象コード

短いものなら、以下のようなもので。

100 IF A=B THEN 130 ELSE 150
130 GOTO 200
150 GOSUB   330:END
330 REM SUBROUTINE

あとは、先日一時的にアップしたオセロのコードとか。
めざらさんのマクロの処理結果と比較すれば、挙動の適否はわかるかと。
 

[5843] Re^16: N88-BASICのRENUMのようなマクロ

めざら 2025/04/29(Tue) 22:28
[関連記事] [5842]へのコメント
http://mezala.la.coocan.jp/
手元で動作を確認してみたいので,サンプルの処理対象コードを提示していただけるでしょうか。
最初に書き込んでいただいたものでも不具合の確認が可能かしら?

ちなみに,ナマではうまく置換するのに,マクロだとダメ……というケースは,過去に経験があります。どんな棘だったか忘れてしまいましたが。

[5842] Re^15: N88-BASICのRENUMのようなマクロ

としき 2025/04/29(Tue) 17:45
[関連記事] [5769]へのコメント
http://toshiki.la.coocan.jp/
相変わらずツリーが乱れているようですが、大丈夫でしょうか。

実は、年度が変わって人が少なくなり、4月はそれまでの平均の倍の時間外労働
をやっている。といっても、たかが20時間前後なんでたいした事はない。
有給も取れているし。が、先日の金曜日から土曜日にかけて、臨時で宿直に
入ったら、明け方の仕事でやらかしてしまいまして。抜いてはいけないケーブル
を抜いてしまったのです。幸い、お客様にはたいした影響がなかったようです。
ということで、ストレス解消を兼ねて、続きをやってみました。

= renum.def
i:初期値   initial num
a:増分     addition
n:新行番号 new num
o:旧行番号 old num

N88-BASICのコードは半角大文字が前提(半角小文字はあえて未対応)

*m
1 ^^ "renum.def"
;初期設定                                   ;vwxの常駐確認とか?
a=10,
n=o=0,
;mp[=2, ps[=pa, RX[+,
;&s

#^ #<                                       ;カーソルを先頭行の行頭にして
&n i=r,                                     ;初期値取得
(r+1)??{ &m(41) >e }                        ;準備ができていないなら終了

;メインループ
                                            ;先頭行は行番号の変更なし
:w                                          ;while(次の行に動ければ)
#> #d                                       ;次の行にカーソルを移動し
#d (r==-1)?>u                               ;その結果が最終行ならループ脱出
#<
&n o=r,                                     ;旧行番号取得
n=i+(ln-1)*a,                               ;新行番号算出
#t                                          ;旧行番号削除
&?("%d",n)                                  ;新行番号出力

#56 "\([ \t]+\)GOTO\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FGOTO\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)GOTO\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FGOTO\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)GOSUB\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FGOSUB\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)GOSUB\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FGOSUB\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)THEN\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FTHEN\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)THEN\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FTHEN\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)ELSE\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FELSE\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)ELSE\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FELSE\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)RESTORE\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FRESTORE\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)RESTORE\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FRESTORE\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)RESUME\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FRESUME\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)RESUME\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FRESUME\2" &?("%d",n) "\3" #m "ay"
    
>w
:u
;後処理
#56 "\([ \t]+\)FGOTO" #m "\1GOTO" #m "ay"
#56 "\([ \t]+\)FGOSUB" #m "\1GOSUB" #m "ay"
#56 "\([ \t]+\)FTHEN" #m "\1THEN" #m "ay"
#56 "\([ \t]+\)FELSE" #m "\1ELSE" #m "ay"
#56 "\([ \t]+\)FRESTORE" #m "\1RESTORE" #m "ay"
#56 "\([ \t]+\)FRESUME" #m "\1RESUME" #m "ay"

RX], ps], mp],
:e ;end
&d
*

きちんと動くこともあるようです。
が、遅い。行数が増えるほど遅くなる。&sで画面表示を抑止しても、
びっくりするほどは早くならない。速度は、めざらさんのマクロのほうが
圧勝です。
ただ、#5776 で危惧されている事象が発生することも確認できました。
う〜む、いくらトレードオフとはいえ、これはちょっと。
あと、上記のマクロでは対応しているつもりだけど、行番号が行末では
ないとき、なぜか変換してくれない。つまり

#56 "\([ \t]+\)GOTO\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FGOTO\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)GOTO\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FGOTO\2" &?("%d",n) "\3" #m "ay"

最初の置換はきちんと動作するのに、次の置換はなぜかうまく動かない、
といった感じの挙動。でも、手作業で\[F7]で変換窓を開き、&?相当の
ところに数字を入れれば、後者の置換もきちんと動作してくれる。
うぅん、何を見逃しているのだ?
 

↑ このページの先頭