Scala 3のscala.deriving.Mirrorの実装詳細は?生成コードは?SumOfとProductOfの違いは?Scala 2の場合は?調べてみました!

少しふざけたタイトルをつけましたが、以下、基本的に超真面目なマニアックな話をします。

Scala 3から、ある程度の定型的なtype classのinstance生成時に低レベルなmacroを書かずに便利に綺麗に書けるMirrorという仕組みが標準で追加されています。

docs.scala-lang.org

https://github.com/lampepfl/dotty/blob/3.1.3-RC2/library/src/scala/deriving/Mirror.scala

雑に一言で説明すると、shapeless 2における GenericLabelledGeneric に近いものが標準に入りました。

今回は、それ自体の紹介ではなく、タイトルに書いた通り、それの内部実装の話です。よってMirrorそのものの詳細な使い方や説明はしません。

また、versionはひとまずScala 3.1.3-RC2、としておきます。

さて、

続きを読む

wartremoverのsbt pluginにTASTy inspector経由で実行する機能入れた

散々tweetしているし、少し前にblogに書きましたが、

xuwei-k.hatenablog.com

それを正式に本体に入れてリリースしました。という話

github.com

続きを読む

Scala 3のinlineによるcompile時間増大に対処する方法

概要や結論を先に書いておくと、適切にプロファイルを取って、適切にボトルネック箇所を見つけて対処しましょう。 という話になるのですが、大まかな概要というか、結果的に使った方法を書くと

  1. sbtのTask毎の時間を記録する機能を使う
  2. Scala 3 compilerのログを多めに出してphase毎の時間を出す
  3. Scala 3のcompiler pluginを書いて特に時間がかかっているファイルを見つけ出す
  4. 普通のinlineやsummonFromだけで書いていたものを、あえてQuotes使ったlow level macroに書き換えて、compile time debugする
  5. 遅い原因となったinstanceを半手動定義する

といった感じです。タイトルに、

続きを読む

WartRemoverをScala 3のTASTy inspector経由で動かす

1週間前のScalaMatsuriで発表 し、色々と話をしたわけですが、それから数日経ってScala 3対応版のwartremoverリリースして、さらに色々と試行錯誤していたら、以下のようなことに気が付き、

やってみたら出来ました、という話。ScalaMatsuriの発表の最後の方で言及していたTASTyの話ですね。その時はこれに全く気がついていなかった。

続きを読む