Общие экземпляры val или var с использованием макроса scala
Как я могу использовать макрос для генерации val?
Например, я хочу, чтобы этот код был сгенерирован:
val test = new Test("arg1")
.. используя "более простой" синтаксис..
test := "arg1"
Макросы - это ответ? Если нет, внутренние DSL/ неявные преобразования? Я хочу избежать создания внешнего DSL.
Что делать, если необходимо несколько аргументов?
1 ответ
Если sbt является источником вашего вдохновения, тогда они делают нетривиальные трюки. Если вы посмотрите на ConsoleProject.scala, то увидите, что они сами запускают компилятор Scala и проходят initCommands
который использует сборку imports
что в свою очередь включает BuildUtil.getImports
который использует
def baseImports: Seq[String] =
"import _root_.scala.xml.{TopScope=>$scope}" :: "import _root_.sbt._" :: "import _root_.sbt.Keys._" :: Nil
И импортированные Keys.scala определяют все ключи настройки, которые вы можете назначить с :=
, И затем они используют кучу макросов, определенных в TaskMacro.scala для реализации :=
,
Поэтому я бы сказал, что sbt использует внешний DSL с некоторыми хитрыми приемами, чтобы использовать существующую инфраструктуру Scala для ее компиляции без развертывания полноценного пользовательского компилятора.