今更な話題なのですが、解説したくなったので解説を書いておきます。
続きを読むScala 3のscala.deriving.Mirrorの実装詳細は?生成コードは?SumOfとProductOfの違いは?Scala 2の場合は?調べてみました!
少しふざけたタイトルをつけましたが、以下、基本的に超真面目なマニアックな話をします。
Scala 3から、ある程度の定型的なtype classのinstance生成時に低レベルなmacroを書かずに便利に綺麗に書けるMirrorという仕組みが標準で追加されています。
https://github.com/lampepfl/dotty/blob/3.1.3-RC2/library/src/scala/deriving/Mirror.scala
雑に一言で説明すると、shapeless 2における Generic
や LabelledGeneric
に近いものが標準に入りました。
今回は、それ自体の紹介ではなく、タイトルに書いた通り、それの内部実装の話です。よってMirrorそのものの詳細な使い方や説明はしません。
また、versionはひとまずScala 3.1.3-RC2、としておきます。
さて、
続きを読むScala 3のinlineによるcompile時間増大に対処する方法
概要や結論を先に書いておくと、適切にプロファイルを取って、適切にボトルネック箇所を見つけて対処しましょう。 という話になるのですが、大まかな概要というか、結果的に使った方法を書くと
- sbtのTask毎の時間を記録する機能を使う
- Scala 3 compilerのログを多めに出してphase毎の時間を出す
- Scala 3のcompiler pluginを書いて特に時間がかかっているファイルを見つけ出す
- 普通のinlineやsummonFromだけで書いていたものを、あえてQuotes使ったlow level macroに書き換えて、compile time debugする
- 遅い原因となったinstanceを半手動定義する
といった感じです。タイトルに、
続きを読むWartRemoverをScala 3のTASTy inspector経由で動かす
1週間前のScalaMatsuriで発表 し、色々と話をしたわけですが、それから数日経ってScala 3対応版のwartremoverリリースして、さらに色々と試行錯誤していたら、以下のようなことに気が付き、
あっ、よく考えたら、Scala 3のlibrary側のQuotes使ったwartremoverでのlinter、tasty inspectorのinterfaceもそのままそれみたいだから、これそのまま再利用出来るのでは???
— Kenji Yoshida (@xuwei_k) March 24, 2022
(compileとは別の任意のタイミングで .tasty ファイルに対してlinter実行が出来るのでは???)https://t.co/lUx65cX94U
やってみたら出来ました、という話。ScalaMatsuriの発表の最後の方で言及していたTASTyの話ですね。その時はこれに全く気がついていなかった。
続きを読むWartremoverのScala 3対応の発表をした
Compiler Plugin難しい