まだまだ登場するプログラミング言語、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も歓迎です。