Scala: макрос Typesafe для извлечения значения поля класса дела

Некоторое время мы бились по этому поводу, но не можем найти решение. В нашем проекте мы хотели бы написать несколько 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, и мы хотели бы дать программистам смутную идею, что они все еще пишут это.

заранее спасибо!

Всего 1 ответ


Пытаться

import shapeless.LabelledGeneric
import shapeless.record._
LabelledGeneric[MyPersonalCaseClass].to(someVariable).get(Symbol("token")) // 123