2013-06-18 1 views
1

Например, у меня есть список и хочет перебрать на него, и сделать преобразование макросъемки каждого значения:Можно ли зафиксировать некоторое значение для использования внутри `` сплайсинга`` макроса `reify`?

reify { 
    someIntListExpr.splice.foreach { i => 
    // transform is a macro of the form 'transform(c: Context)(i: c.Expr[Int]): c.Expr[Unit] 
    transform(i).splice 
    } 
} 

Но компилятор выплевывает сообщение об ошибке:

found: Int 
required: c.universe.Expr[Int] 

Есть ли способ Исправить это?

ответ

1

В простых случаях это будет делать трюк:

someIntListExpr.splice.foreach { i => 
    transformImpl(c)(c.Expr[Int](Ident(newTermName("i")))).splice 
} 

В качестве альтернативы вы можете создать метод, как этот

def trans(i: Int): Unit = macro transform 

и применить его:

reify { 
    someIntListExpr.splice.foreach { i => 
    trans(i) 
    } 
} 

Иногда вы можете получить List[c.Expr[Unit]].

Если ваш метод (def myMethod(l: List[Int]): unti = macro myMethodImpl) называется как myMethod(List(1, 2, x)), то вы можете получить List[c.Expr[Unit]]:

def myMethodImpl(c: Context)(l: c.Expr[List[Int]]): ... = { 
    import c.universe.Apply 
    val es = l match { 
    case Apply(_, l: List[c.Expr[Int]]) => l 
    } 
    ... 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^