Как объединить несколько выражений в синтаксисе кавычек макросов scala 3?

#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[Любой] (не a Vector ). Кстати, я не знаю, можно ли сделать то, что вы хотите, с помощью сплайсинга, а именно добавить метод к анонимному объекту.

3. @gianlucaaguzzi это создаст блок. Если поместить его в тело класса, то на самом деле он находится в конструкторе, а не в определениях класса.

4. Я понимаю… Что ты хочешь с этим сделать new StructuralTypeRoot { ${expr} } ? Вы уже пробовали использовать одно выражение??

5. @gianlucaaguzzi, я не знаю, как это соединить. Таким образом, рассматриваемый код-это просто мое намерение: динамически создавать набор методов из списка в теле класса или признака