elixirのバージョンによってelixir schoolの教材とちょっとエラーの出力が違うかもというお話

2023/07/27に公開

結論
一定のバージョン後には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)を明示的に指定する必要がある。

とのことです。

覚えておくと少し便利かも記事でした。

https://elixirschool.com/ja/lessons/basics/basics

Discussion