エディタと実行部がクラ/サバ分担になったBASICみたいなものを書いています

明けましておめでとうございます 雪に埋もれた岩見沢からご挨拶です


…と書いたのが2024年のこと。
ずぼらなもんで、季節ごとに写真を貼り替えるなんて思いもよらず、放っといたら一年たってしまいました
今は2025年の12月28日です。いやまったく(なにが)
またヨタヨタと始めます。まずはソースを読んで、何をやっていたのか思い出さないと(そこからか)
あ、そうだ。何をやっていたのかは思い出しましたIF〜THEN〜ELSEを実装しようとしていたら仕事が
忙しくなって、中断したまんまで忘れていたのでした。作ってるのは↓こんなもんです。
画像をクリックすると、運が良ければ動くものにたどり着けます。



今回(2025〜2026の正月休み)IF文の実装を準備しています。ただし完全形ではありません。
「そこまで簡略化して良いものか」と設計した当の本人が疑問に感じるほど。

1️⃣️IF文の効力はその行内のみ
2️⃣️ELSE文には未対応
3️⃣️ネストは不許可

という具合。実はELSE実装、ネスト対応、ENDIF区切りの、真っ当な(?)仕様を書き上げたものの、
くっだらねーっ、バッカみてーっと感じちゃったんですね。
実装にもテストにも手間がかかる。それはまだ我慢するとしても、出来上がったものが誰がやってもおなじもの。
ほかにまだまだやりたいことがたくさんあるので、真面目な実装は諦めました。
将来気が向いたら、やるかもしれないけど。
ただBASICの動作確認のためにIF文はあった方がいい。それで上に書いたような超手抜き仕様をぶち込みました。
この休みの間に書き上げます。あ、言い切っちゃいかんのだった。書き上げられたらラッキーとか。
...
書き上げました。上に書いたとおり最小限の仕様なので、期待はしないでください(誰が何を期待するのか)。
運良くブラウザ内にエディタ画面が立ち上がったら、name<Enter>と入力。なにか表示されたら幸運な人です。

仕組みの話をすると、ブラウザで動いているのはエディタだけです。実行部はサーバで動いています。
Enterキーが押されるとカーソル行がサーバに送られます。サーバで動いている実行部は、文字列を実行します。
これがremBASICの基本的な動作です。BASICなので行番号付きのテキストはプログラム。runで実行されます。

10 a=10:b=20
20 print a,b
run
10 20
Ready!

print文のカンマ(タブ飛ばし)は未実装なので空白で代用です。つぎはif文のサンプルです。

10 a=10:b=20
20 if a=10 then b=b*2:goto 40
30 b=b*3
40 print a, b
run
10 40
Ready!

a=10をa!=10に変えると、bの値が60になります。

BASICの心得のある人はニタニタしているかも知れませんが、このif文はかなり変則的です。
まず、endif句がないのでthen以降は行をまたぎません。だから最後はgoto文で飛ばしています。
また、else句には対応していません。elseが必要な場合は、if文の次の行に書いてください。
さらに(おのれまだ言うか)、ネストもできませんのでif文の中にif文を書くこともできません。
できないことばかりですみません。巨大な伸びしろがあると思っていただければ、あはは

そうそう、関係式も含めて式の評価はevalとかじゃなくて自力で書いています。だから演算子の
加除や解釈には柔軟に対応できます。作者にとってのメリットでしかありませんが。

もうひとつ、これを試してください。
print "Start":wait 3000:print "End."

Start
(3秒経過)
End.
Ready!

エディタと実行部の分離だけではなく非同期動作。3秒経過中でもエディタの動作はロックしていません。
これが数少ないremBASICの特徴のひとつです。なんの役に立つのかはこれから考えます。

今回はここまで 2026/1/11

うっ、いかん。倍精度浮動小数点型変数の扱いがバグってる。
この際なので数値変数の型の扱いを整理しました。表に現れるものじゃないですが。

組み込み定数(PIとか)と組み込み関数(SINとか)の実装(追加)が楽になるように内部構造を改良しました。

特に組み込み関数は開発初期の段階であまり考えずに実装していたために、式評価の最下位に当たる
expressionFactor()の中で「SINが来たら括弧内を評価して…」みたいに雑なことをしていました。
これをきちんと整理しないと、今後の拡張が面倒になると気がつきました(いつもながら遅い)。
関数名と処理先(SINならcmdSIN()とか)その他を含む定数テーブルを定義して、関数個々の処理先を
expressionFactor()から外に出しました。2026/01/16

速報っ PRINTが'?'で省略できるようになりましたっ。
BASICの伝統(?)に従い、'? ...'を'PRINT ...'として扱います。
これで昔懐かしいBASICの気分が少しは味わえるかと。2026/01/20


節操なき技師団 岩見沢支部 加野島英渡(Hideto KANOSHIMA)