Мы долго бились по этому поводу, но не можем найти решение. В нашем проекте мы хотели бы написать несколько DSL для переноса некоторого старого кода в нашу кодовую базу.
Мы хотели бы создать макрос, который с учетом экземпляра класса case дает нам возможность извлечь значение в безопасная манера. В этом случае должна быть возможность объявить x типа Int.
case class MyPersonalCaseClass(token: Int, str: String)
val someVariable = MyPersonalCaseClass(123, "SOMESTRING")
val x = Macros.->(someVariable, "token")
Здесь «токен» - это константа времени компиляции, ссылающаяся на имя поля. Макрос может быть объявлен с чем-то вроде
def ->[T](value:T,key: String): Any = macro MacrosImpl.arrow[T]
Что касается нашего понимания, единственный способ был с макросами whitebox, смело меняйте подписи.
def arrow[T: c.WeakTypeTag](c: whitebox.Context)(value: c.Expr[T], key:c.Expr[String]): c.Expr[Any] =
{
import c.universe._
val caseClassType: c.universe.Type = weakTypeOf[T]
???
}
Scala версия «2.12.8».
Причина, по которой нам нужно что-то вроде этого, заключается в том, что мы переносим много кода из perl, и мы хотели бы дать программистам смутную идею, что они все еще пишут это .
Заранее спасибо!