新興プログラミング言語Gleam
アキッパの山下です。
仕事ではAWSやPHPといったメジャーな技術を触ることが多いですが、プライベートでは、ちょっとマイナーだったりなかなか日の目を見ない技術に触れるのが好きです。
そんな中で、最近v1.0がリリースされた Gleam という言語を紹介します。(公式TOPのアイコンは、是非マウスオーバー・クリックなどしてみてください)
どんな言語なのか?
公式サイトでも言及されていますが、最近のプログラミング言語トレンドをうまく取りこんでいます。
強力な型システム
関数型言語の表現力
並行処理が得意
コンパイラがRustで書かれている点も、2020年代の言語ならではですね。個人的には、以下がとても的を射ていると思いました。非常にシンプルな言語です。
以下は、公式ドキュメントを読み込んだり手元であれこれ触ってみた中で、コレはと思った機能です。
パターンマッチ・パイプライン
以下がGleamでのFizzBuzzです。これだけでも、Gleamの特色がある程度見えてくると思います。
import gleam/io
import gleam/int
import gleam/list
pub fn main() {
list.range(1, 100)
|> list.map(fizz_buzz)
|> list.each(io.println)
}
fn fizz_buzz(i: Int) -> String {
case i % 3, i % 5 {
0, 0 -> "FizzBuzz"
0, _ -> "Fizz"
_, 0 -> "Buzz"
_, _ -> int.to_string(i)
}
}
関数の宣言スタイルはRustそのものですね。パターンマッチも、Rust(とRustに影響を与えた言語たち)のそれが色濃く反映されています。
少し珍しいところでは "|>" のパイプライン演算子でしょうか。パイプラインといえば、これもまたなかなか日の目を見ない F# 発祥ですが、慣れると病み付きになるとても便利なものです。
大抵の言語に存在する if は無く、パターンマッチに全振りしている点は、潔い割り切りで好感が持てます。
Records
よく言われる「仕様を型で表現」する事ができる、とてもパワフルな機能です。RustのEnum、F#の判別共用体、ElmのCustom typeに相当するもの、と捉えて良さそうです。
「仕様を型で表現」については、ここでアキッパ特有のデータモデルを元にしたサンプルコードが書けるとカッコ良いのですが、パッと思いつかなかったので代わりに素晴らしい記事を紹介しておきます。(是非、リンク先の記事にある原典も辿ってみてください)
Option/Result
これらも、記事中で紹介してきたプログラミング言語ではお馴染みの概念ですね。nullに苦しめられなくて済む世界は最高です。とは言え現実との妥協点であるpanicがあったり、todo機能を用意してくれている点も痒いところに手が届いていて嬉しいところです。
周辺環境が充実している
公式サイトにすべて内包されていますが、ドキュメントの充実が素晴らしく、いつでも簡単にGleamを試して学ぶことができるようになっています。
playground
インストール方法
標準ライブラリ
各種パッケージ
いくつかの他言語経験者向けに、チートシートも準備されています。アキッパはPHPメインなのでPHPユーザー向けのチートシートリンクを記載しておきますが、Elmユーザー向けのチートシートもあるのは驚きました。
Gleam for PHP users
使いどころ
シンプルかつユニークな言語で非常に面白くはあるものの、標準ライブラリも数は少なく、例えばファイルI/Oはどうやれば良いか?などはまだちゃんと理解できていません。
標準ライブラリは最低限に絞って、足りない機能はパッケージでアドオンしてもらう思想なのかもしれませんが、パッケージ数も記事執筆時点で368と、production readyはまだまだこれからの言語だと思います。
逆に言うと、「○○言語には既にあるライブラリ・パッケージ」を開発・公開していくチャンスに満ちているとも言えます。言語仕様がシンプルな分、学習コストも高くないので、興味を持たれた方はチャレンジしてみてください。
まとめ
新興言語 Gleam の紹介でした。記事中にもっとサンプルコードを入れられれば良かったのですが、最近は専らインフラばかり触っており、FizzBuzzが関の山だったのが反省点です。
リハビリも兼ねて、プライベートでPython製の jaconv というツールをGleamにポーティングしてみています。夏頃までにはGleam Packagesに公開できるよう精進します。