Мой вопрос может быть изобретен, и я хотел бы рассмотреть его больше, чем доказательство выполнимости, чем что-то рекомендованное. Чтобы дать вам некоторый контекст, я хотел бы попробовать, чтобы во встроенном DSL другой синтаксис, чемКак создать переменные с макросами в Scala
val myVal = "someContent"
Я хотел бы быть в состоянии сделать что-то подобное:
assign("SomeContent","someVariable") => converted to
someVariable = "SomeContent"
и затем в код, переменная доступна. Как правило, мы могли бы что-то подобное в РЕПЛ:
assign("John","name")
println("Hello " + name)
Я думал, что макросы (или ScalaCompiler плагин, но я думаю, что здесь еще сложнее), чтобы сделать трюк. Сначала я не знаю, возможно ли это быть новым для макросов.
Я начал с чем-то упрощенным, учитывая, что я только манипулировать строки, и я начал с чем-то вроде
def assign(content: String, targetVal: String):Unit = macro assignMacro
def assignMacro(c:Context)(content: c.Expr[String],
targetVal: c.Expr[String]):c.expr[Unit] = {
import c.universe._
c.Expr[Unit](ValDef(Modifiers(), TermName(targetVal.value),
TypeTree(), Literal(Constant(content.value)))
}
К сожалению, это, кажется, не из-за нескольких ошибок
- Сначала он жалуется, когда я попытайтесь создать новое имя термина, предлагая, если я уверен, тогда я должен назвать eval моего выражения. К сожалению, я не уверен;) и если я стараюсь, она не;)
- Если я заменю этот targetVal и содержание с константами, как myVal и MyContent, я получаю второе сообщение об ошибке, как компилятор нашел и требуется блок
Я немного застрял. Во-первых, это возможно? Я бы предположил, да;) И как я мог это достичь?
Спасибо за помощь
С наилучшими пожеланиями
Это невозможно в таком виде в 2.10, но вы могли бы написать что-то вроде 'валь синтаксиса = назначить («Джон», «имя»); import syntax._', чтобы получить тот же эффект. –
Я использую 2.11.0-M4. Является ли это возможным ? – pascal
Я так не думаю, но я еще не знаком со всеми новыми углами 2.11. –