2022-12-25
IchigoJam web 改良のために、WebAssemblyを調べて発見「orelang(プログラミング言語を作る。1時間で。 - Qiita)」(参考、自作言語をWebAssemblyに対応する試み - Qiita

ちょうど、JSONで記述できるプログラミング言語が欲しかったことを思い出し、オリジナルはJava言語で作られているものを、JavaScriptで実装して、Geo3x3に対応しました。


「code4fukui/orelang」
forked shuetsu/orelang
JSONの入れ子配列として記述するorelang。先頭がオペレーターで後ろがパラメータというシンプルな構文。Geo3x3に対応するためオペレーターを追加しましたが、全実装で220行とコンパクト。Denoで、ブラウザで、サクッと動かせます。自作プログラミングの練習にもどうぞ!(メインのプログラム、orelang.js


拡張子orelangは、JSONで記述するので、VSCodeの右下「Plain Text」をクリック、orelangに対応づける、JSONと設定しましょう。


色付けされてカッコの対応忘れがなくなります!


「Geo3x3/README.md at master · taisukef/Geo3x3」

92言語目のorelang対応。Geo3x3と相互変換するプログラムは、下記のような感じ。

["step", ["func", "geo3x3_encode", ["step", ["set", "level", ["String.parseInt", ["pop"]]], ["set", "lng", ["String.parseFloat", ["pop"]]], ["set", "lat", ["String.parseFloat", ["pop"]]], ["set", "res", "E"], ["if", ["<", ["get", "lng", 0]], ["step", ["set", "res", "W"], ["set", "lng", ["+", ["get", "lng"], 180]] ]], ["set", "lat", ["+", ["get", "lat"], 90]], ["set", "unit", 180], ["set", "i", 1], ["while", ["<", ["get", "i"], ["get", "level"]], ["step", ["set", "unit", ["/", ["get", "unit"], 3]], ["set", "x", ["Math.floor", ["/", ["get", "lng"], ["get", "unit"]]]], ["set", "y", ["Math.floor", ["/", ["get", "lat"], ["get", "unit"]]]], ["set", "res", ["+", ["get", "res"], ["+", ["get", "x"], ["*", ["get", "y"], 3], 1]]], ["set", "lng", ["-", ["get", "lng"], ["*", ["get", "x"], ["get", "unit"]]]], ["set", "lat", ["-", ["get", "lat"], ["*", ["get", "y"], ["get", "unit"]]]], ["set", "i", ["+", ["get", "i"], 1]] ]], ["get", "res"] ] ], ["func", "geo3x3_decode", ["step", ["set", "code", ["pop"]], ["set", "flg", false], ["set", "begin", 0], ["set", "c", ["String.charAt", ["get", "code"], 0]], ["if", ["=", ["get", "c"], "W"], ["step", ["set", "flg", true], ["set", "begin", 1] ], ["if", ["=", ["get", "c"], "E"], ["set", "begin", 1], ["return", null] ]], ["set", "unit", 180], ["set", "lat", 0], ["set", "lng", 0], ["set", "level", 1], ["set", "i", ["get", "begin"]], ["while", ["<", ["get", "i"], ["String.length", ["get", "code"]]], ["step", ["set", "n", ["String.indexOf", "0123456789", ["String.charAt", ["get", "code"], ["get", "i"]]]], ["if", ["=", ["get", "n"], 0], ["break"]], ["if", ["<", ["get", "n"], 0], ["return", null]], ["set", "unit", ["/", ["get", "unit"], 3]], ["set", "n", ["-", ["get", "n"], 1]], ["set", "lng", ["+", ["get", "lng"], ["*", ["%", ["get", "n"], 3], ["get", "unit"]]]], ["set", "lat", ["+", ["get", "lat"], ["*", ["Math.floor", ["/", ["get", "n"], 3]], ["get", "unit"]]]], ["set", "level", ["+", ["get", "level"], 1]], ["set", "i", ["+", ["get", "i"], 1]] ]], ["set", "lat", ["+", ["get", "lat"], ["/", ["get", "unit"], 2]]], ["set", "lng", ["+", ["get", "lng"], ["/", ["get", "unit"], 2]]], ["set", "lat", ["-", ["get", "lat"], 90]], ["if", ["get", "flg"], ["set", "lng", ["-", ["get", "lng"], 180]]], ["Array", ["get", "lat"], ["get", "lng"], ["get", "level"], ["get", "unit"]] ] ] ]

変数のget/setで冗長になりますが、割と素直に組めました。 JavaScriptと同様、importにも対応しているのでネット上をライブラリとして使えるようにしたので、軽量安全プログラミング言語としての活躍もありうるかも?


「Geo3x3 FORTRAN77版プルリク」

こちらもチャレンジしたかった、大文字アルファベットで記述する、BASICのご先祖さま、古のフォートラン!91言語目としてプルリクいただきました!gfortranでちゃんと動きます!


「Geo3x3、92言語をサポート!」

目指せ100言語!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS