コンパイル時にマクロに渡されるパラメーターの型を判別しようとしています。を使用すると機能するようです<:<
が、使用すると機能しません=:=
。理由はわかりません。誰かが私を正しい方向に向けることができますか? 以下にサンプルコードを含めました。
このマクロ:
import language.experimental.macros
import scala.reflect.macros.Context
object Macros {
def say(param: Any): Unit = macro impl
def impl(c: Context)(param: c.Expr[Any]): c.Expr[Unit] = {
if (param.actualType.<:<(c.universe.typeOf[String])) {
c.universe.reify { printf("string: %s\n", param.splice) }
} else if (param.actualType.<:<(c.universe.typeOf[Int])) {
c.universe.reify { printf("int: %d\n", param.splice) }
} else {
c.universe.reify { printf("any: %s\n", param.splice) }
}
}
}
このコードで呼び出されます:
object Test extends App {
Macros.say("Hi")
Macros.say(1)
Macros.say(Blah)
}
case object Blah
戻り値:
string: Hi
int: 1
any: Blah
しかし、代わりに型の等価性 ( =:=
) をチェックすると、マクロは次のように返します。
any: Hi
any: 1
any: Blah
どんな助けでも大歓迎です。