2021-05-15
TOMLづくりの過程で発見「Janet Programming Language

Janet Programming Language
関数型プログラミング命令型プログラミングの両方に対応していて、マルチプラットフォーム、C言語で簡単に組み込めるのが特徴!(src on GitHub)

LISPをよりシンプルにしたような文法で、ループなど普通のプログラミング言語としても書けるので難易度は低め。 こちらGeo3x3のエンコード geo3x3.janet です。

(defn- encode_fn [code level i lat lng unit] (if (>= i level) code (encode_fn (string code (+ 1 (math/floor (/ lng unit)) (* (math/floor (/ lat unit)) 3))) level (+ i 1) (- lat (* (math/floor (/ lat unit)) unit)) (- lng (* (math/floor (/ lng unit)) unit)) (/ unit 3.0) ) ) ) (defn encode [lat lng level] (if (< level 1) "" (encode_fn (if (>= lng 0.0) "E" "W") level 1 (+ lat 90.0) (if (>= lng 0.0) lng (+ lng 180.0)) (/ 180.0 3.0) ) ) )

普通のプログラミング言語で 1+1 と書くところを (+ 1 1) と書くのが関数型の特徴。geo3x3.lispを元にJanatのドキュメントを見つつ、IchigoJamのように対話型で試す環境(REPL)を使って試しながら実装。 ちょうど、作ってみたいと思っていたシンプルな関数型言語、結構理想に近いかも?

組み込みが簡単そうなので、やってみました。
Releases · janet-lang/janet」から、Macなのでosx版をダウンロードして展開。 C言語で今回作った geo3x3.janet を読み込んで動かしてみます。(src on GitHub)

#include <janet.h> #include <stdio.h> int loadTextFile(const char* fn, char* buf, int bufsize); int main(int argc, const char *argv[]) { janet_init(); JanetTable *env = janet_core_env(NULL); char buf[10 * 1024]; if (!loadTextFile("geo3x3.janet", buf, 10 * 1024)) { janet_dostring(env, buf, "geo3x3", NULL); } janet_dostring(env, "(print (encode 35.65858 139.745433 14))", "main", NULL); janet_deinit(); return 0; }

あとは、C言語のヘッダーとソース、1ファイルずつ使ってコンパイルするだけ(arch -x86_64 zsh、arch -arm64 zsh などで切り替えてもok!)

gcc -I janet-v1.15.5-osx/include janet-v1.15.5-osx/src/janet.c main.c ./a.out E9139659937288

動きました!生成されるバイナリサイズは750KBほどとそこそこコンパクト。共有ライブラリを動的リンクすることもできます。(sh on GitHub)


オープンライセンスでオープンソースな緯度経度の1文字列表現「Geo3x3」の対応言語が77になりました! みなさんの気になる言語はありますか?なければ、ぜひ実装ご協力ください!

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