Gleam標準ライブラリv0.40.0における破壊的変更の説明と対応方法
Gleam標準ライブラリv0.40.0がリリースされました。CHANGELOGの該当箇所はこちらです。 このリリースではいくつかの破壊的変更が行なわれています。
またこのページではこれらの変更の説明と対応方法を説明しており、随時更新されます。
暫定的な対応
まず始めにv0.40.0に対応していないライブラリを利用している方が、これらの変更に対応する方法を説明していきます。
gleam.tomlを以下のように変更し、manifest.tomlを削除します。
その後gleam runなりgleam buildを実行すればプログラムが正常に実行・コンパイルされるはずです。
code:diff
-gleam_stdlib = ">= 0.34.0 and < 2.0.0"
+gleam_stdlib = ">= 0.34.0 and < 0.39.0"
削除された関数と対応方法
dynamic.unsafe_coerce
dict.update
order.max
order.min
dynamic.unsafe_coerce
削除理由: 型システムを弱体化させるため。
代替方法: dynamic.dynamic等のデコーダーを利用してデコードします。
dict.update
削除理由: upsertに名前が変更された。
代替方法: 名前を変更する。
order.max
削除理由: 役に立たないため。
代替方法: 比較する式を記述する。
code:rust
case a, b {
Gt, _ -> Gt
Eq, Lt -> Eq
_, _ -> b
order.min
削除理由: 役に立たないため。
代替方法: 比較する式を記述する。
code:rust
case a, b {
Lt, _ -> Lt
Eq, Gt -> Eq
_, _ -> b
}
非推奨になった関数
function.curry*関数とfunction.apply*関数は非推奨になりました。
function.apply*
削除理由: 可読性を下げるため。
代替方法: fnリテラルや関数キャプチャ構文を使用する。
code:rust
let add2 = fn() { fn(x: Int) { x + 2 } }
add2() |> function.apply1(2) // -> 4
code:rust
let add2 = fn(x: Int) { x + 2 }
add2(2) // -> 4
function.curry*
削除理由: 匿名関数で代替できるため。
代替方法: 匿名関数を使用する。
既に関数が存在している場合には関数キャプチャ構文が使えます。
code:rust
import gleam/int
let add2 = function.curry2(int.add)(2)
add2(3) // => 5
code:rust
let add2 = int.add(_, 2)
add(3) // => 5
追加された関数
floatモジュールにmodulo関数が追加されました。
code:rust
pub fn modulo(
dividend: Float,
by divisor: Float,
) -> Result(Float, Nil)
code:rust
modulo(13.3, by: 3.3)
// -> Ok(0.1)
modulo(-13.3, by: 3.3)
// -> Ok(3.2)
modulo(13.3, by: -3.3)
// -> Ok(-3.2)
modulo(-13.3, by: -3.3)
// -> Ok(-0.1)
バグ修正
uri.origin: 関数の末尾にスラッシュが誤って含まれることがなくなりました。
dynamic.optional_field: デコーダーは、値を暗黙的にオプションとして扱わなくなりました。 キー自体の有無のみを扱い、それをドキュメントにインライン化します。
string.trimがJavaScriptでカンマを削除する可能性があるバグを修正しました。
Intl APIがサポートされていない古いJavaScriptランタイムでIteratorの反復がクラッシュする可能性があるバグを修正しました。
uri.percent_decodeの動作によりJavaScriptで+がスペースとしてデコードされるバグを修正しました。
Erlangでstring.sliceが無効な値を返す可能性があるバグを修正しました。
intモジュールのInvalidBaseエラーはNilに置き換えられました。
機能向上
string.pop_grapheme関数がErlang上で最適化され、パフォーマンスが大幅に向上しました。