2024-02-08
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 <?xml version="1.0" encoding="UTF-8"?> <root> <enc>E9139659937288</enc> <dec> <lat>35.6586337900162</lat> <lng>139.74546563023935</lng> <level>14</level> <unit>1.1290058538953522E-4</unit> </dec> </root>

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

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

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で書いちゃうかなぁ。

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