Я пытаюсь создать макрос, который позволит мне захватить текст выражения, передаваемого конструктору. Я хочу текст выражения для целей отладки. Макрос реализация выглядит следующим образом:Ошибка типа при использовании параметра типа в качестве аргумента типа для другого типа, передаваемого в реализацию макроса
package nimrandsLibrary.react.macroImpl
object Macros {
def applyImpl[T : context.WeakTypeTag, U : context.WeakTypeTag](context : scala.reflect.macros.Context) (expression : context.Expr[T]) : context.Expr[U] = {
import context.universe._
context.Expr[U](context.universe.New(context.universe.weakTypeOf[U], expression.tree, context.universe.Literal(context.universe.Constant(expression.tree.toString()))))
}
}
definiation выглядит следующим образом:
class Signal(expression : => T, expressionText : String) {
...
}
object Signal {
def apply[T](expression : T) = macro nimrandsLibrary.react.macroImpl.Macros.applyImpl[T, Signal[T]]
}
Однако, где бы я это называю, как показано ниже, я получаю сообщение об ошибке.
val mySignal = Signal{ 2 } //type mismatch; found : Int required : T
Но, конечно, тип для T является Int, поэтому ошибка не имеет смысла.
Кажется, что каким-то образом в расширении макроса компилятор забывает заменить Signal [T] сигналом [Int]. В качестве эксперимента, я попытался изменить место определения так, что оба типа должны быть предусмотрены, например, так:
def apply[T, U](expression : T) = macro nimrandsLibrary.react.macroImpl.Macros.applyImpl[T, U]
Тогда, я называю это так:
Signal[Int, Signal[Int]]{ 2 }
И это работает. Но, конечно, это вовсе не синтаксис, к которому я стремлюсь. Является ли это ошибкой, или я делаю это неправильно? Есть ли обходной путь?
Я не уверен, почему у тега Weak Type есть T вместо Int, но это исправлено. – Nimrand
Интересное редактирование. Я попытался это сделать, но ему не понравился синтаксис U [_]: WeakTypeTag, поэтому я предположил, что у вас не может быть WeakTypeTag более высокого типа. Наверное, я ошибся. Я не думал однозначно определять неявный параметр (я не могу поверить, что просто сказал это). – Nimrand