Следуя за кодом Compilation issue when accessing parameter value in Scala macro, я хочу определить макрос, который применяет предикат. Если присутствует оператор fn = c.eval (pred), тогда код клиента не может скомпилироваться без каких-либо указаний относительно характера проблемы.Передача и вызов функции более высокого порядка в макросе
def fnInvocation(value : Int, pred : c.Expr[ Int => Boolean ]): Boolean = fnInvocationImpl
def fnInvocationImpl(c: Context)(value : Int, pred : c.Expr[ Int => Boolean ]) : c.Expr[Boolean] = {
var fn = x => x % 2 == 0
// fn = c.eval(pred) // client compilation fails if this line is included
val result = fn(value)
c.literal(result)
}
Должен ли я сделать это изнутри макроса?
> не имеет смысла для них иметь аргументы выражения Understood - это была просто ошибка «вырезать и вставить» в вопросе ;-) > см. Мой смысл здесь, например, о том, как это работает > с литералами функций. Таким образом, 'function literal 'является фактически« лямбда-выражением »? Или есть дальнейшие тонкости в отношении того, что можно оценить во время компиляции? Я не понимаю, как отличить то, что можно оценить во время компиляции и что нужно делать во время выполнения. Существуют ли какие-либо полезные общие рекомендации? В любом случае, спасибо @Travis за вашу помощь. – NietzscheanAI
@ user217281728 - Я думаю, что столкнулся с этой проблемой. http://stackoverflow.com/questions/36634787/scala-not-found-value-macro?noredirect=1#comment60864975_36634787 –