✨
elixirのバージョンによってelixir schoolの教材とちょっとエラーの出力が違うかもというお話
結論
一定のバージョン後にはand,or 演算子に特定の制約が導入されたためエラー出力が異なる可能性がある。
Elixir Schoolの教材では
42 and true
を実行すると
** (ArgumentError) argument error: 42
というエラーが出力されるとなっています。
しかしwslよりlivebook環境を立ち上げて同じコードを実行したところ
** (BadBooleanError) expected a boolean on left-side of "and", got: 42
(stdlib 5.0) erl_eval.erl:746: :erl_eval.do_apply/7
(elixir 1.14.2) src/elixir.erl:294: :elixir.eval_forms/4
(elixir 1.14.2) lib/module/parallel_checker.ex:107: Module.ParallelChecker.verify/1
lib/livebook/runtime/evaluator.ex:621: anonymous fn/3 in Livebook.Runtime.Evaluator.eval/4
lib/livebook/runtime/evaluator.ex:825: Livebook.Runtime.Evaluator.with_diagnostics/2
lib/livebook/runtime/evaluator.ex:615: Livebook.Runtime.Evaluator.eval/4
lib/livebook/runtime/evaluator.ex:426: Livebook.Runtime.Evaluator.continue_do_evaluate_code/6
lib/livebook/runtime/evaluator.ex:330: Livebook.Runtime.Evaluator.loop/1
というエラーがでます。
この差異はChatGPT曰く
Elixirのバージョン1.11以降、and演算子とor演算子は特定の制約が導入されました。Elixir 1.11のリリースノートによれば、以下の変更が加えられました。
左辺の式が真偽値でない場合、and演算子およびor演算子の使用はコンパイルエラーとなる。
代わりに、and演算子の左辺にブール値(trueまたはfalse)を明示的に指定する必要がある。
とのことです。
覚えておくと少し便利かも記事でした。
Discussion