Scala: макрос Typesafe для извлечения значения поля класса дела - PullRequest
1 голос
/ 23 марта 2020

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

1 голос
/ 24 марта 2020

Попробуйте

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