Общие экземпляры 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 для ее компиляции без развертывания полноценного пользовательского компилятора.

Другие вопросы по тегам