Gleam 触ってみる
2024年03月29日 22:07:11 JST
gleamというプログラミング言語が1.0.0をリリースしたことを知り、興味がわいたので触ってみる。 型システムがあり、Elm,OCaml,Rustなどの型システムからインスピレーションを得ている. Erlang上で動作したり、javascriptのランタイムでも動作できるらしい。
何もわからない人はまずplaygroundがあるのでそれを触ってみる
まずはインストール。
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
イイ感じ!!
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
エコーサーバーできた。
Request型はGenericsなのでそこをどう別の型に変換するか迷った。 gleam_dynamicを使えばいけることがいけたのでStringに変換してそれをそのまま返却するようにした。
test書いた。
2024年03月30日 23:44:50 JST
きれいしたので、次は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))
}
...
}
}
成果物は下のリンクにおいておく。