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の実装、多様なプログラミング言語の世界を覗いてみましょう!