#scala #scala-macros #scala-3
Вопрос:
Теперь я научился заключать expr в кавычки. Но я не нашел, как соединить несколько выражений в цитате. У меня есть выбираемая черта и функция макро-внедрения:
trait StructuralTypeRoot extends Selectable
def macroImpl(using q: Quotes): Expr[Any] = {
val exprs: Vector[Expr[Any]] = Vector(
'{def f = 1},
'{def g = 2}) /*make some method def exprs here*/
'{
new StructuralTypeRoot{
${exprs} // can't do this. How can i splice exprs here
}
}
}
Комментарии:
1. Я думаю, имеет смысл, что вы не можете просто соединить a
Seq
(илиVector
) изExpr
s. Возможно, вам придется сделать некоторые вещи более низкого уровня сQuotes
экземпляром.2. Если каждое выражение независимо, способ сделать это может быть объединен с выражением
;
. Например, вы можете написать:val combinedExpression : Expr[Any] = exprs.reduce((a, b) => '{$a;$b})
Таким образом,combinedExpression
является Expr[Любой] (не aVector
). Кстати, я не знаю, можно ли сделать то, что вы хотите, с помощью сплайсинга, а именно добавить метод к анонимному объекту.3. @gianlucaaguzzi это создаст блок. Если поместить его в тело класса, то на самом деле он находится в конструкторе, а не в определениях класса.
4. Я понимаю… Что ты хочешь с этим сделать
new StructuralTypeRoot { ${expr} }
? Вы уже пробовали использовать одно выражение??5. @gianlucaaguzzi, я не знаю, как это соединить. Таким образом, рассматриваемый код-это просто мое намерение: динамически создавать набор методов из списка в теле класса или признака