2013年12月8日日曜日

コンパイル時FizzBuzz

無名再帰の記事を書いたと思ったら書いて無かったし、テンプレート制約なるものを見聞きしたので使ってみたりした。


まずはテンプレート制約を使ったコンパイル時fibonacci


こんな風に、template temp(T) if(expr)みたいに書くと、if文で判定してテンプレートを適用してくれるみたいです。
これを使うと以前のstatic if文を使ったfizzbuzzも、


static if文を並べるよりは綺麗に見えるんじゃないでしょうか。適用可能なテンプレートが複数あるとエラーになるので、if文がちょっとアレな感じはありますが。

ここで、以前書いたmixin FizzBuzzを見ると、(このコードだとmixinする意味が謎ですが)


こんなふうにFizzBuzzの判定をする関数を作って利用してますが、D言語はコンパイル時に関数を実行出来るスゴイ奴があるので、


このように何も考えなくてもコンパイル時fizzbuzzできますね。

fizzbuzzなんか書いてないで勉強しないといけないんですが。

※追記
早速ご指摘頂きました。



templateとか書かなくてもenum fizzbuzz ~ でいけるというdmd 2.064の新機能を使うようです。
さらにラムダを使うとgenFizzBuzzすら要らなかったという話。
究極的にはこれだけでいい


D言語マジで頭おかしい

※更に追記
ラムダとか書かなくても3項演算子で代入する式書くだけだった!!!

0 件のコメント:

コメントを投稿