слишком мало списков аргументов для вызова макроса

Учитывая следующий код:

case class JetDim(dimension: Int) {
  require(dimension > 0)
}

object JetDim {
  def build(dimension: Int): Int = macro JetDimMacro.apply
}

и макрос, который он вызывает:

def apply(dimension: Int): Int = macro applyImpl

def applyImpl(c: Context)(dimension: c.Expr[Int]): c.Expr[Int] = ...

Я получаю эту ошибку времени компиляции:

[error]  too few argument lists for macro invocation
[error]  def build(dimension: Int): Int = macro JetDimMacro.apply

Почему?


person Kevin Meredith    schedule 29.04.2015    source источник


Ответы (1)


Ключевое слово macro принимает метод, который должен иметь параметр Context в качестве первого списка параметров (а затем, сколько бы Expr аргументов ни было в последующих списках). В JetDim вы даете macro метод, который сам имеет реализацию макроса. Это просто недопустимый синтаксис — вы не можете «вкладывать» macro вот так. Вам нужно либо вызвать JetDimMacro.apply напрямую (как обычный вызов метода) в JetDim.build, либо использовать macro JetDimMacro.applyImpl (что, скорее всего, вам нужно).

person Travis Brown    schedule 29.04.2015
comment
Спасибо, Трэвис. Я пытался следовать модели вашего блога post . Какая разница в вашем посте и моей неудачной попытке (из вопроса)? - person Kevin Meredith; 29.04.2015
comment
@KevinMeredith У меня, вероятно, не будет времени ответить подробно до завтра, извините, это напряженная неделя. - person Travis Brown; 29.04.2015