Symbol
マクロを使用して、ケース クラス データ ツリーのフィールドとサブフィールドの sを参照するための一般的なソリューションを取得したいと考えています。
この要点に触発されて、次のスケルトンを作成しました。
import language.experimental.macros
import reflect.runtime.universe._
import reflect.macros.Context
object SubRef {
case class SubRef[ SourceT, TargetT ]( symbol : Symbol )
implicit def functionToSubRef
[ SourceT, TargetT ]
( f : SourceT => TargetT )
: SubRef[ SourceT, TargetT ]
= macro functionToSubRefMacro[ SourceT, TargetT ]
def functionToSubRefMacro
[ SourceT : c.WeakTypeTag, TargetT : c.WeakTypeTag ]
( c : Context )
( f : c.Expr[ SourceT => TargetT ] )
: c.Expr[ SubRef[ SourceT, TargetT ] ]
= ???
}
このソリューションは次のように機能することを期待しています。
case class A( b : B )
case class B( c : Int )
val ref : SubRef[ A, Int ] = _.b.c
渡された関数が次の場合、マクロ変換は失敗するはずです。
- 単一の式ではありません
- ソースシンボルのサブフィールドであるシンボルの値を返しません。
targetSymbol.owner[.owner...] == sourceSymbol
欠落しているマクロの実装は何ですか?