🤠

lustre(Gleam) に触ってみた

2024/04/07に公開

(私のTL上で)最近流行っている Gleam を触ってみました。
Erlang VMで動く言語として作られましたが、途中のバージョンからJavaScriptにも変換可能になり The Elm Architectureインスパイアなlustreというフレームワークがあり、そちらを試してみました。

今回作ってみたもの

Gleamを触るに当たって、適度にstdlibを使うような例として、英文章から英単語の頻出度リストを作るツールを作りました。細かな記号などには考慮していないので、ざっくりとした頻出度土リストになります。

リポジトリはこちら。
https://github.com/ababup1192/gleam_frequency_list/tree/master

The Elm Architecture部分

Elmを触ったことある方なら、まんまだなーという印象になると思います。

pub fn main() {
  let app = lustre.simple(init, update, view)
  let assert Ok(_) = lustre.start(app, "#app", Nil)
}

// MODEL -----------------------------------------------------------------------

type Model {
  Model(text: String, frequency_list: List(#(String, Int)))
}

fn init(_flags) -> Model {
  let text =
    "sentences..."
  Model(text, frequency_list: to_frequency_list(text))
}

// UPDATE ----------------------------------------------------------------------

pub opaque type Msg {
  UpdateText(value: String)
}

fn update(_model: Model, msg: Msg) -> Model {
  case msg {
    UpdateText(text) -> {
      Model(text, to_frequency_list(text))
    }
  }
}

// VIEW ------------------------------------------------------------------------

fn view(model: Model) -> Element(Msg) {
  html.div([], [
    html.textarea(
      [event.on_input(UpdateText), attribute.rows(15), attribute.cols(100)],
      model.text,
    ),
    html.ul(
      [],
      model.frequency_list
        |> list.map(fn(frequency) {
          let #(word, count) = frequency
          html.li([], [
            html.text(word),
            html.text(" "),
            html.text(
              count
              |> int.to_string,
            ),
          ])
        }),
    ),
  ])
}

文章から頻出度リストを求める部分

stdlibは必要十分と感じました(まだまだ触り足りないですが)。

fn to_frequency_list(text: String) -> List(#(String, Int)) {
  text
  |> string.replace("\n", "")
  |> string.replace(".", " ")
  |> string.split(" ")
  |> list.filter(fn(x) { x != "" })
  |> list.map(string.lowercase)
  |> list.fold(dict.new(), fn(acc, word) { dict.update(acc, word, increment) })
  |> dict.to_list()
  |> list.sort(fn(a, b) { int.compare(pair.second(b), pair.second(a)) })
}

fn increment(x: Option(Int)) -> Int {
  case x {
    Some(i) -> i + 1
    None -> 1
  }
}

まとめ

この例だけですとElmでいいじゃん的な気持ちになりますが、Gleamの魅力はやはり ErlangVMとJavaScriptどちらの運用も出来るということでしょうか。例えば、関数型ライブラリをTypeScriptで利用しようとすると、無駄に複雑過ぎたり、機能不足を感じたり TypeScriptというよりはJavaScriptに足を引っ張られる部分がないところがAltJavaScriptの言語の良いところだと思います。そのため、Webフロント・バックエンド・IoTなど言語の人気が出て成長していけばあらゆる用途で使えるようになるのは楽しみの一つかと思います。

逆に言えば、現時点ではエコシステムや参考情報の少なさが苦しい部分が多いです。そこは活気を出していき充実していけば良いかなと思います。久しぶりに新しい言語に触れたので楽しかったです。

Discussion