INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32]

目次 | ←前へ / 2026-03-06 00:00 / 次へ→ / 最新へ⇒

■次なる野望(自作スクリプトに配列やユーザー定義関数を追加する)も、生成AIにお願いして作ってもらったりする

2026年 3月 6日(金) 0:00:00



RSSRSS配信中
https://www.inasoft.org/



花粉の大量飛散と、ここのところの気圧変化のせいで、頭痛の止まない日々がやってきております。春、大嫌い。気分を紛らわせるために、本業の仕事をとっとと切り上げて趣味のプログラミングに精を出しているのですが、今日は久々に独自スクリプト言語構築の話題を。

3月2日に書いた記事の最後で、FR-Scriptへの、ユーザー定義関数またはサブルーチンの実装と、配列の実装をやってみたいということを書きました。

というわけで、いつもの通り、Geminiに「この言語に配列を追加したい場合、どのように改修すればよいですか?」「スクリプト内でユーザー定義関数を作れるようにするための改修方法を教えてください。」と聞いてみたところ、サクッと3分くらいで実装方法……というか実際のコーディングを出してくれました。

それを現在のインタプリタ(Geminiが関わらない範囲で自力で改修している部分もあるので)に馴染むように修正し、テストをしたところ、4時間くらいで実装完了してしまいました。なんか、あっけないな…。

しかも今回は、かなり「バイブコ-ディング」寄りなプロンプトでの依頼となりました。前みたいに、プロンプトを書くのに30分かけたりとかもしてません。体感的には「あっ」という間の出来事でした。

また、頼んでもいないのに、配列の要素数を調べるための組込関数とか、ローカルスコープの取り扱いとかも追加してくれて、ありがたい。いくつかはありがたく採用しました。

まぁ、Geminiから提案された状態のプログラムでは、グローバルスコープでreturnしたときにプログラムが呼び出し側を巻き込んで無言終了することになるので、手直しはしましたが、それでも4時間で完成してしまうのは驚異的でした。プログラミングの仕事、奪われちゃうなぁ。


まぁ、その是非はいったん置いておくとして、今月1日に公開したソフト群に搭載したFR-Script ver.1を大幅刷新して、FR-Script ver.1.5を作ろうかと思います。たぶん、需要のないことをやっているので、誰も使っていないと思うので、スクリプトの仕様を大幅に刷新しても、誰も困らないと思うので。

ところで個人的に、FR-Scriptで、ここしばらくスクリプトを作っていて生じているミスは、次の通りです。

  • 文字列を受け取る変数名への $ の付け忘れ。
  • 文字列を返す組込関数の名前に $ を付け忘れ。
  • ブロックの始まり「 { 」の書く位置を間違いやすい。

文字列を扱う変数や関数のシンボル名に $ を付ける仕様が邪魔です。

なぜ $ を付けるようにしているかと言うと、前身となる R-Script を作っていた際に、パーサーが文法から文字列を扱っているのか、数値を扱っているのかを見分けないと、うまく作れなかったからです。

現在の実装では、文字列と数値は、どっちを扱っていても良いように内部的にフラグを持って制御できるようになってますし(Geminiのおかげで汎用的に作られている)、ぶっちゃけ、変数名や関数名のシンボル名に $ があろうがなかろうが、きちんと動くようになっています。旧仕様を理不尽に引き継いでいるだけです。このせいでミスが起きやすくなっているなら、もはや旧仕様を維持する意味はありません。

ブロックの始まり「 { 」については、if, while, forなどと同じ行に書く必要があるのですが、C/C++と同様に、つい、if, while, forなどの次の行に書いてしまうミスを犯すことがあります。R-Script/FR-Scriptは、文末をセミコロンなどではなく改行であると定義しているため(Geminiからも散々不満を言われ続けている仕様)、実装がややこしくなっていてこうなっていました。しかし、手軽なスクリプト言語の在り方としては好ましくないため、改良したいです。

ついでに、変数名の大文字・小文字を区別しない仕様のせいで、std::mapを使った実装が面倒くさくなっています。これも邪魔。……という諸々の不満点を考慮した上で、FR-Script ver.1.5では、次のような改良(いくつかは下位互換性を破棄)を加えようと思います。

  • ユーザー定義関数の追加(引数に用いる変数名のみローカルスコープの概念を取り入れる。他はグローバルスコープonly)
  • 一次配列の追加。(配列宣言は、任意の配列番号に要素を設定することで行う。要素数の拡張も可能とする。縮小は考えない)
  • 文字列を受け取る変数のシンボル名の最後に $ を付けなければならないルールを撤廃($を付けようが付けまいが、数値も文字列も入れられるようにする)
  • 文字列を返す組込関数・コールバック関数のシンボル名の最後に $ を付けなければならないルールを撤廃($を付けようが付けまいが、数値も文字列も返してよいことにする。組込関数で、名前に $ が付いているものは、すべて $ を取り除く(下位互換性を破棄))
  • 変数のシンボル名については、大文字・小文字の区別を行う。(ただし、FR-Script文法のキーワード、組込関数の名称、初期代入変数については、大文字・小文字の区別を行わない。コールバック関数名については呼び出し元実装者が決定する)
  • レキサで定義していたキーワードTRUE(=1)FALSE(=0)を、初期代入変数へ格下げ。(スクリプトで後から値を書き換えられるイメージ。ただし、これはイメージの話で、変数は大文字・小文字の区別を行ってstd::mapで管理するが、初期代入変数は大文字・小文字の区別を行わず、constテーブルで管理するなど実装が異なるため、厳密には書き換えられるわけではない)
  • 初期代入変数は、スクリプト内で作った変数よりも後に検索を行うようにする。初期代入変数のサーチは、std::mapに代入して、通常の変数と同様の手続きで行うのではなく、FR-Scriptのインタプリタのプログラム側で準備したconstで固定レコード長の配列をbsearch()で探す方式に変更。これにより、スクリプトの実行開始や変数のサーチが数マイクロ秒速くなることを期待。(実際にはCPUキャッシュに入るレベルのメモリ領域しか使わないので、体感的な差はないだろうけど)
  • 組込関数は、FR-Scriptのインタプリタのプログラム側でconstで固定レコード長の関数テーブルを準備し、bsearch()で探す方式に変更。これにより、Geminiが用意した方式に比べて関数の呼び出しが平均数百ナノ秒速くなることを期待。(実際にはCPUキャッシュに以下略)
  • R-Script時代に存在していたrepeat-untilを追加。(これはなんとなく)
  • 組込関数に、大小文字無視比較をするためのstrcmpi()を追加。(大小文字無視比較をするための手軽な手段がなくなっていたことに後から気づいたため。R-Script時代は、大小文字無視比較は「===」で行っていた。FR-Scriptでは「===」は「厳密な一致(数値・文字列の型が違えば違うとみなす)」に変更された。なお、FR-Scriptの==は、型が違っていても、互いに文字列変換した時に一致すれば等しいとみなしている)
  • ブロックの始まり「 { 」を、if, while, for等の次の行に書いても良いようにする。

まぁ、こんなところでしょうかね。



目次 | ←前へ / 2026-03-06 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはX等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。


- 最近の更新 -



3488542 (+0438)[+0613]

Copyright© 2010-2026 INASOFT