新着記事

− 野ざらし言 −

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

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

としき 2025/05/10(Sat) 19:41
[関連記事] [5863]へのコメント
http://toshiki.la.coocan.jp/
なるほど、ダブルワードで4バイトなんですね。
無理やるやる方法もわかったので、どうしても避けられない場合はこちらを採用させていただくということで、やっぱり違った方向を模索していくことになりそうです。というか、模索しています。

実はここ2〜3日、ちょっと風邪気味。
発熱は全くないというか、何回はかっても平熱なんですが、軽い咳と鼻水がちょっとと倦怠感。そんな状況にもかかわらず昨夜は酒を飲んだので、今日の起床は11時半過ぎ。
仕方ない、今夜も酒を飲んで寝るか。

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

めざら 2025/05/10(Sat) 16:36
[関連記事] [5862]へのコメント
http://mezala.la.coocan.jp/
> すり替えしか方法がないのでしょうか。

いや,考えようで色々あると思いますけど……
例えば,ダブルワードなので2個の変数を用意して,a=wa..63, b=wa..64, なんて保存した値を,後でそれぞれの場所に戻せばいいわけなので。

……と言うか,そもそも「すり替え」でなく「保存/復帰」でしたね。すまない。
#M で値を保存させる場所を直接変更することはできませんものね。


> 簡単に、プッシュポップで退避させて、ということができるとうれしい

上と同様に,#M ((wa..63)[, ((wa..64)[, みたいに簡単にプッシュしておいて,後でそれぞれの値を wa..63=0], wa..64=0], みたいに簡単にポップして #U。

それよりは,&#M(1) と &#U(1) を使ったほうが楽じゃないですか?


なお,ダブルワードの値を保存・復帰するには,ロング演算関数を利用できます。

#M &Le(pu,wa+126) ;マークして値を保存
;; あれこれあって
&Le(wa+126,pu) #U ;値を戻してジャンプ

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

としき 2025/05/10(Sat) 13:02
[関連記事] [5859]へのコメント
http://toshiki.la.coocan.jp/
> 簡単に書き換わってしまうので,注意が必要

そうでした、昔、わりと泣きを見たものです。

> 4バイトのバッファを用意してすり替えるのが吉かと。

すり替えしか方法がないのでしょうか。
簡単に、プッシュポップで退避させて、ということができるとうれしいのですが、無理なんですかね。

[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 のアドレスが
入れ替わってしまうための不具合だと早とちりしたのですが,
さすがにそんなことではないですよね。

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

↑ このページの先頭