だいぶ今更感ある
- https://github.com/xuwei-k/zeroapply/blob/v0.1.4/zeroapply/src/main/scala/CaseClassImpl.scala
- https://github.com/xuwei-k/zeroapply/blob/v0.1.4/scalaz/src/main/scala/CaseClass.scala
- https://github.com/xuwei-k/zeroapply/tree/a2ca8fb7ceb#scalazequal-and-scalazorder-macro
大雑把な解説
- すでにshapeless-contribというライブラリに同等以上の機能を持ったものが存在する
- 同等以上とは、今回作ったやつは、今のところ、seald traitとその子供(つまり代数的データ型における和)に対応していない。単独のcase classのみ
- わざわざ、機能的に劣化版なのになぜ作ったのか?というと
マクロの公式の解説で
http://docs.scala-lang.org/ja/overviews/macros/implicits.html
Lars Hupel 氏が紹介した TypeClass 型クラステクニックのような型レベルプログラミングに基づいたジェネリックプログラミングという方法もあるが、やはりこれも手書きの型クラスのインスタンスに比べると性能が劣化するのが現状だ。
implicit の具現化
implicit マクロを用いることで、型クラスのインスタンスを手書きで定義する必要を無くし、性能を落とさずにボイラプレートを一切無くすことができる。
とありますが、これはそれのことでいいのかな?(よくわかってない)
あと、zeroapplyというライブラリですが、もともと効率のよいApplicativeをいい感じにマクロで展開して最適化するライブラリだったんですが
(詳細は以下の過去ブログ参照)
Scalaのマクロ使ってコンパイル時に全部Applicaiveをインライン展開するzeroapplyというライブラリを作った
今回のマクロ、べつに単独のライブラリでもよかったのですが、新しく作るよりzeroapplyに入れてしまったほうが楽だったので入れてしまいました。依存ライブラリが同じだったりで都合がよかったので。