Я пытаюсь написать макрос, который работает с параметром функции. Я обрабатываются анонимные функции всех длин аргументов довольно легко, сделав параметр в макро Any
, а затем на соответствие Function(body, params)
, но я хотел бы, чтобы иметь возможность передать ссылку на функцию переменной:Как определить, является ли параметр макроса Scala функцией?
val valFunction = (something: Int) => (something * 3).toString
val functionVal = Macros.myMacro(valFunction)
I был в состоянии использовать WeakTypeTag
сек согласно official documentation, чтобы сделать эту работу с функцией одного параметра:
def myMacro[T, U](param: T => U) = macro myMacroImpl[T, U]
def myMacroImpl[T, U](c: Context)(param: c.Expr[T => U])
(implicit tt: c.WeakTypeTag[T], implicit ut: c.WeakTypeTag[T]) = {...}
но макрос работает только для функций одного параметра. Я попробовал проверить член с именем «apply», который также был методом, но я столкнулся с проблемами стирания, а также был обеспокоен перегруженными методами и таковыми. Обходной путь, к которому я в настоящее время изобилую, - создать 23 макроса для Function0
через Function22
, но whoo-boy Я не доволен этим. Есть ли другой подход, который я могу предпринять?
'c.universe.definitions.FunctionClass' был именно тем, что я искал! Неявный класс типов интересен, но я пошел только с совпадением тега типа с использованием FunctionClass и прервал макрос в случае не-макета. Благодаря! –
Некоторые незначительные улучшения: 1) в силу @implicitNotFound вы можете предоставить пользователям сообщение об ошибке компиляции, 2) я бы, вероятно, сделал Functionable классом, так что вам не нужно создавать новый анонимный подкласс каждый раз при материализации происходит –