Gleam 触ってみる

Posted on Mar 29, 2024

2024年03月29日 22:07:11 JST

gleamというプログラミング言語が1.0.0をリリースしたことを知り、興味がわいたので触ってみる。 型システムがあり、Elm,OCaml,Rustなどの型システムからインスピレーションを得ている. Erlang上で動作したり、javascriptのランタイムでも動作できるらしい。

何もわからない人はまずplaygroundがあるのでそれを触ってみる

https://tour.gleam.run/

まずはインストール。

brew install gleam

miseを使っているならコミュニティのプラグインあるのでそれを利用できる

https://github.com/vic/asdf-gleam.git

mise install gleam

2024年03月29日 22:21:17 JST

https://gleam.run/writing-gleam/

書いてみよう。

projectの作成はcargoと似ている

gleam new vars

LSPがあるので設定する

nvimはnvim-lspconfigで設定できる。

	nvim_lsp.gleam.setup({
		capabilities = capabilities,
	})

formatterも備えているので設定する。 ただ普段none-lsを利用しており、none-ls自体にプラグインがないので一旦個別で対応する。

    if #clients > 0 and contains({ "gleam" }, clients[1].name) then
        local augroup = vim.api.nvim_create_augroup("LspFormatting", {})
        vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
        vim.api.nvim_create_autocmd("BufWritePre", {
            group = augroup,
            buffer = bufnr,
            callback = function()
                vim.lsp.buf.format({
                    async = false,
                })
                require("fidget").notify("LSP Formatted!!", vim.log.levels.INFO)
            end,
        })
    end

イイ感じ!!

img


2024年03月29日 22:32:45 JST

packageの追加はcargoと一緒

gleam add envoy argv

devのみは--devをつける。

ファイル名でpackage分割ができる。

- vars.gleam -> vars
- vars/internal.gleam -> vars/internal

テストはtestディレクトリに書く。 関数などはpublicにしないといけない?

erlang上で動かすためにgleescriptをいれる必要がある。

gleam add --dev gleescript
gleam run -m gleescript # ./vars binaryができる。

macなら./varsでよい。 windowsならescriptが動作する環境でescript ./vars ...で実行可能。


2024年03月29日 22:40:02 JST

明日以降簡単なhttpサーバーとか作ってみる。


2024年03月30日 21:56:35 JST

簡単なエコーサーバー作ってみる。

-はプロジェクト名に使えないので_にする。

gleam new simple_http_server

公式のパッケージがあるのでそれを利用する。 https://github.com/gleam-lang/http


2024年03月30日 22:28:13 JST

https://github.com/yochidros/gleam_simple_http_server/commit/11575360d1ef938d647cd2b5749c71ab99373baf

エコーサーバーできた。

echo_server

Request型はGenericsなのでそこをどう別の型に変換するか迷った。 gleam_dynamicを使えばいけることがいけたのでStringに変換してそれをそのまま返却するようにした。

test書いた。

https://github.com/yochidros/gleam_simple_http_server/commit/60931e8ecbd2ea27eaab72ff33842cca073275ec


2024年03月30日 23:44:50 JST

https://github.com/yochidros/gleam_simple_http_server/commit/2296ef495e56b74ff58bc324ef8c73995faa415d

きれいしたので、次はjson型とかにチャレンジしてみる。


2024年03月31日 10:43:58 JST

一応jsonをエンコード・デコードするものはできた。 todoメソッド生やしてPostだけ受け付けるようにした。

ただ、一つのメソッド対応だけでもResultのパターンマッチが多いのでうまくPipelineを活用したい、、、

fn todo_(ctx: Request(Dynamic)) -> Response(BytesBuilder) {
    ...
    case ctx.method {
    http.Post ->
      case dynamic.string(ctx.body) {
        Ok(content) ->
          case decode_create_todo(content) {
            Ok(t) ->
              response.new(200)
              |> response.set_body(encode_todo(t))
            Error(e) ->
              response.new(500)
              |> utils.set_body(utils.parse_json_string_from(e))
          }
        Error(errors) ->
          response.new(500)
          |> utils.set_body(utils.parse_string_from(errors))
      }
      ...
    }
}

成果物は下のリンクにおいておく。

https://github.com/yochidros/gleam_simple_http_server/commit/24cd7edad153002ba8cbc078cb792029fe7dacdd