2022-03-19
まだまだ登場するプログラミング言語、2020年に登場したJavaVMで動く関数型プログラミング言語「Flix」を発見、位置情報を3x3のグリッドの再帰で表すオープンソースなジオコーディング「Geo3x3」を書いてみました。
プログラミング言語Flixに関するMagnus Madsen氏へのインタビュー


Geo3x3 in Flix
式が割と自然に書けるタイプの関数型言語。副作用がないPureと副作用ありのImpureを関数定義に付けるところがユニーク。コンパイラが厳格で、使ってない変数があったり、型がちょっとでも違うと怒られるので、きっちり書きたい人にいいかも。

namespace Geo3x3 { def encode_fn(code: String, level: Int32, i: Int32, lat: Float64, lng: Float64, unit: Float64): String = if (i >= level) code else encode_fn( "${code}${1 + Float64.clampToInt32(Float64.floor(lng / unit), 0, 2, 0) + Float64.clampToInt32(Float64.floor(lat / unit), 0, 2, 0) * 3 }", level, i + 1, lat - Float64.floor(lat / unit) * unit, lng - Float64.floor(lng / unit) * unit, unit / 3.0 ) pub def encode(lat: Float64, lng: Float64, level: Int32): String & Pure = if (level < 1) "" else encode_fn( match lng { case _ if lng >= 0.0 => "E" case _ if lng < 0.0 => "W" }, level, 1, lat + 90.0, match lng { case _ if lng >= 0.0 => lng case _ if lng < 0.0 => lng + 180.0 }, 180.0 / 3.0 ) def decode_fn(code: String, lat: Float64, lng: Float64, level: Int32, unit: Float64): (Float64, Float64, Int32, Float64) = if (String.length(code) == 0) (lat + unit * 3.0 / 2.0 - 90.0, lng + unit * 3.0 / 2.0, level, unit * 3.0) else let n = Char.toInt32(String.charAt(0, code)) - Char.toInt32('1'); decode_fn( String.dropLeft(1, code), lat + Int32.toFloat64(n / 3) * unit, lng + Int32.toFloat64(n mod 3) * unit, level + 1, unit / 3.0 ) def decode_fne(code: String): (Float64, Float64, Int32, Float64) = decode_fn(code, 0.0, 0.0, 1, 180.0 / 3.0) def decode_fnw(code: String): (Float64, Float64, Int32, Float64) = let (lat, lng, level, unit) = decode_fne(code); (lat, lng - 180.0, level, unit) pub def decode(code: String): (Float64, Float64, Int32, Float64) = if (String.length(code) == 0) (0.0, 0.0, 0, 180.0) else let n = String.charAt(0, code); match n { case _ if n == 'W' => decode_fnw(String.dropLeft(1, code)) case _ if n == 'E' => decode_fne(String.dropLeft(1, code)) } }

似たような言語を探してベースとしながら、その言語のリファレンスを読みながら試行錯誤して作っていきます。作れば作るほど経験が溜まって、新言語の習得が早くなり、分かりやすくプログラミング言語を伝えるための参考になります。

あと15言語で100言語!
未対応の言語で、チャレンジしたい方いればぜひ!
自作言語のPRも歓迎です。

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