�…L@eÅu¿¸ÿ€X K"Y^ҚTy"È¡a"²*µöz½0uü°êN(x`¶X@½<Év±–Ë<Ä,N¸åØ^FÆf:U¹+Œ­fº•zð©Šë­Ð9kÚG�å%¢�b¯õ÷� Ù?]ú£Y§bidwddates2024-02-08T23:55:00etitlexMApple発の設定記述言語Pkl(ピクル)でGeo3x3対応105言語目!dtagsg#geo3x3curlxhttps://fukuno.jig.jp/4215dbodyy# Apple発の新プログラミング言語「Pkl(ピクル)」の登場!?
「アップル、新しいプログラミング言語「Pkl」をオープンソースで公開。コンフィグレーション生成用 | テクノエッジ TechnoEdge」


「Pkl」

JSON、YAML、plistなどの設定ファイル生成に特化した言語で、Python、JavaScript、Swiftのような汎用プログラミング言語ではありません。きっと設定ファイルが複雑化して困ったのでしょう。


せっかくなので、緯度経度精度の文字列エンコーディング、Geo3x3に対応しました「Geo3x3 in Pkl」。

デバッグがしづらいのが難点でしたが、関数型のエンコード、デコードをベースに比較的シンプル、素直な実装でできました。 import "https://taisukef.github.io/Geo3x3/geo3x3.pkl" enc = geo3x3.encode(35.65858, 139.745433, 14) dec = geo3x3.decode("E9139659937288") こちらがPklで書いたGeo3x3モジュールを使うコード。ブラウザやDenoで使えるJavaScriptと同様、URLでインポートできるのはうれしい! インストールしたpklを使って、生成してみましょう。

$ pkl eval simple_geo3x3.pkl enc = "E9139659937288" dec { lat = 35.6586337900162 lng = 139.74546563023935 level = 14 unit = 1.1290058538953522E-4 }

こちらが標準、pcf(pkl format?)

$ pkl eval simple_geo3x3.pkl -f json { "enc": "E9139659937288", "dec": { "lat": 35.6586337900162, "lng": 139.74546563023935, "level": 14, "unit": 1.1290058538953522E-4 } }

JSON

$ pkl eval simple_geo3x3.pkl -f yaml enc: E9139659937288 dec: lat: 35.6586337900162 lng: 139.74546563023935 level: 14 unit: 1.1290058538953522E-4

YAML

$ pkl eval simple_geo3x3.pkl -f xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;enc&gt;E9139659937288&lt;/enc&gt; &lt;dec&gt; &lt;lat&gt;35.6586337900162&lt;/lat&gt; &lt;lng&gt;139.74546563023935&lt;/lng&gt; &lt;level&gt;14&lt;/level&gt; &lt;unit&gt;1.1290058538953522E-4&lt;/unit&gt; &lt;/dec&gt; &lt;/root&gt;

XML。(Listを出力した場合、文字列としてすべて繋がってしまっているのはバグかも?)

$ pkl eval simple_geo3x3.pkl -f plist &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt; &lt;plist version="1.0"&gt; &lt;dict&gt; &lt;key&gt;enc&lt;/key&gt; &lt;string&gt;E9139659937288&lt;/string&gt; &lt;key&gt;dec&lt;/key&gt; &lt;dict&gt; &lt;key&gt;lat&lt;/key&gt; &lt;real&gt;35.6586337900162&lt;/real&gt; &lt;key&gt;lng&lt;/key&gt; &lt;real&gt;139.74546563023935&lt;/real&gt; &lt;key&gt;level&lt;/key&gt; &lt;integer&gt;14&lt;/integer&gt; &lt;key&gt;unit&lt;/key&gt; &lt;real&gt;1.1290058538953522E-4&lt;/real&gt; &lt;/dict&gt; &lt;/dict&gt; &lt;/plist&gt;

Macの開発環境、Xcodeでおなじみplist(XML)

下記がGeo3x3のPkl(ピクル)実装。 module geo3x3 function encode_fn(code, level, i, lat, lng, unit) = if (i >= level) code else encode_fn( code + "\(lng ~/ unit + lat ~/ unit * 3 + 1)", level, i + 1, lat - unit * (lat ~/ unit), lng - unit * (lng ~/ unit), unit / 3.0 ) function encode(lat, lng, level) = encode_fn( if (lng < 0.0) "W" else "E", level, 1, lat + 90.0, if (lng < 0.0) lng + 180.0 else lng, 180.0 / 3.0 ) function decode_fn(code, _lat, _lng, _level, _unit, wflg) = if (code.length == _level) new { lat = -90.0 + (_lat + _unit * 3.0 / 2.0) lng = if (wflg) (_lng + _unit * 3.0 / 2.0) - 180.0 else _lng + _unit * 3.0 / 2.0 level = _level unit = _unit * 3.0 } else let (n = code[_level].toInt() - 1) decode_fn( code, _lat + n ~/ 3 * _unit, _lng + n % 3 * _unit, _level + 1, _unit / 3.0, wflg ) function decode(code) = if (code[0] == "W") decode_fn(code, 0.0, 0.0, 1, 180.0 / 3.0, true) else decode_fn(code, 0.0, 0.0, 1, 180.0 / 3.0, false) 構造は、カッコでもインデントもなしの式として書きます。読みやすさのためインデントしています。

新しい言語を使って実装してみるのは楽しいですね!
テストデータを生成するのに使える気がしますが、使い慣れてるJavaScriptで書いちゃうかなぁ。 cimgxKhttps://img.sabae.cc/data/20240209/dfb27bf9-97bf-499f-a4cb-e5330dc9035d.jpg