Я хочу использовать макросы scala для генерации кода. В спецификациях c я определяю некоторые типы Event
, и эти события будут отправлены в тот же метод (здесь workImpl
) и возвращают значение указанного типа c. Тип возврата не определяется, если я просто вызываю workImpl
, потому что он обрабатывает разные входные данные и возвращает разные результаты. Но определяется карта между типами ввода и типами вывода . Цель состоит в том, чтобы сделать тип возвращаемого значения доступным.
Scala макрос - это fantasti c и, возможно, помогает. Я хочу добиться автоматической генерации кода путем добавления аннотации типа возвращаемого события для каждого типа события. Код, который должен быть сгенерирован: code1
или code2
.
object A {
private def workImpl(x: Any): Any = ???
@anno(X_RET)
case class X()
@anno(Y_RET)
case class Y()
@anno(Z_RET)
case class Z()
// code1: auto generate work1 and the implicits
def work1[T](x:T)(implicit ev: T=>M) = workImpl(x).asInstanceOf[M]
implicit val X_TO_X_RET: X=>X_RET = null
implicit val Y_TO_Y_RET: Y=>Y_RET = null
implicit val Z_TO_Z_RET: Z=>Z_RET = null
// code2: auto generate these methods
def work2(x:X) = workImpl(x).asInstanceOf[X_RET]
def work2(x:Y) = workImpl(x).asInstanceOf[Y_RET]
def work2(x:Z) = workImpl(x).asInstanceOf[Z_RET]
}
Итак, возможно ли это и как этого добиться? Если это невозможно, какое-либо решение еще?