2024-02-09
Pkl(ピクル)はApple発のコンフィグレーション生成用言語でしたが、その比較として紹介されていたJsonnet(ジェイソンネット)はGoogle発!Geo3x3をサクッと移植して106言語目!


「Jsonnet - Jsonnet Configuration Language」

名前の通り、JSON生成に特化した言語です。YAMLやXMLへの出力はコード記述が必要な様子。


Pkl版をベースに、緯度経度精度の文字列エンコーディング、Geo3x3対応「Geo3x3 in Jsonnet」。 local geo3x3 = (import "geo3x3.libsonnet"); { enc: geo3x3.encode(35.65858, 139.745433, 14), dec: geo3x3.decode("E9139659937288"), } こちらがJsonnetで書いたGeo3x3モジュールを使うコード。URLインポートは非対応。(参考、Importing from URLs · Issue #9 · google/jsonnet

インストールしたJsonnetを使って、生成してみましょう。

$ jsonnet simple_geo3x3.jsonnet { "dec": { "lat": 35.658633790016196, "level": 14, "lng": 139.74546563023935, "unit": 0.00011290058538953522 }, "enc": "E9139659937288" }

JSON出力、項目名でソートされる点に注意。

IchigoJam BASICでもおなじみ、プログラミング言語の基本、条件分岐のIF文の書き方にちょっと違いあり。

Pklの場合

if (cond) true else false

Jsonnetの場合

if cond then true else false

カッコの有無、thenの有無。意味は変わらないのでプログラミング言語を作る人の好みです。

下記がGeo3x3のJsonnet実装。 local encode_fn = function(code, level, i, lat, lng, unit) if i >= level then code else encode_fn( code + (std.floor(lng / unit) + std.floor(lat / unit) * 3 + 1), level, i + 1, lat - unit * std.floor(lat / unit), lng - unit * std.floor(lng / unit), unit / 3.0 ) ; local _encode = function(lat, lng, level) encode_fn( if lng < 0.0 then "W" else "E", level, 1, lat + 90.0, if lng < 0.0 then lng + 180.0 else lng, 180.0 / 3.0 ) ; local decode_fn = function(code, lat, lng, level, unit, wflg) if std.length(code) == level then local lng2 = lng + unit * 3.0 / 2.0; { lat: -90.0 + (lat + unit * 3.0 / 2.0), lng: if wflg then lng2 - 180.0 else lng2, level: level, unit: unit * 3.0, } else local n = std.parseInt(code[level]) - 1; decode_fn( code, lat + std.floor(n / 3) * unit, lng + n % 3 * unit, level + 1, unit / 3.0, wflg ) ; local _decode = function(code) decode_fn(code, 0.0, 0.0, 1, 180.0 / 3.0, code[0] == "W") ; { encode: function(lat, lng, level) _encode(lat, lng, level), decode: function(code) _decode(code), } 構造は、Pkl(ピクル)と同様、カッコでもインデントもなしの式として書きます。読みやすさのためインデントしています。Pklと違って出力する項目名と変数名が同じでも動くので、ちょっとスマートに実装できています。

JsonnetはJSON出力用であり、JSONファイルもJsonnetとして処理可能なので、JSON好きにはPkl(ピクル)より使いやすそうです。

学ぶたびに世界が広がる、プログラミング言語!


「taisukef/Geo3x3: a simple geo-coding system for WGS84 - in Jsonnet」

106言語によるGeo3x3の実装、多様なプログラミング言語の世界を覗いてみましょう!

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