コミケ告知

サークル networkmaniacs.net(旧:浜風もっこす) 2017.02.17 デブサミ内 DevBooksに出展します。
詳細は circle タグの記事へ。
2016年3月24日木曜日

Elixirでattributeを用いたコンパイル時分岐

C/C++でいう#ifdef DEBUG 的なことを、moduleのattributeを使って行おうとしたところ、dialyzerさんに文句を言われてしまいました。if (@flag)のような記述が展開され、if(true) とか if(false) とかになって、欠陥のあるパターンマッチ記述として検出されるわけですね。
そこで、ただコンパイルの前にtrue/falseが判定されるだけのマクロを書いて対処しました。

上記のソースコードをdialyzerにかけた結果はこうなります。(dialyxir使用)
% mix dialyzer
Starting Dialyzer
dialyzer --no_check_plt --plt C:\Users\moccos/.dialyxir_core_18_1.2.3.plt (オプション略)
  Proceeding with analysis...
hoge.ex:8: The pattern 'false' can never match the type 'true'
 done in 0m1.31s
done (warnings were emitted)

# 最初に書いたバージョンに間違いがあったので、2016/03/28に修正しました。
# Elixir1.3系で動かなかったので2016/06/24に再度修正

0 件のコメント:

コメントを投稿