It would be nice if we could write an annotation handler that is used to generate code at compile time (or when runtime code (re)gen is being applied). The canonical use-case I have for this at the moment is to avoid this:
starts_with(Axis, Value) ->
binop(starts_with, Axis, Value).
eq(Axis, Value) ->
binop(eq, Axis, Value).
%% etc
binop(Op, Axis, {literal, _}=Literal) ->
{Axis, {operator, Op}, Literal}.
And instead to be able to do something like this:
-aliases({[eq, starts_with, ends_with|_Etc], binop, {prefix, function}}).
binop(Op, Axis, {literal, _}=Literal) ->
{Axis, {operator, Op}, Literal}.
such that the wrapper functions are generated for me. Quite what the callback/annotation handler module needs to look like isn't clear to me at the moment, but I suspect either a generate_code function or maybe some meta-data to indicate that we want code-gen to occur would do:
-module(aliases).
%% etc...
code_gen(#annotation{data={Aliases, Target, Options}, AST, Options) ->
{export, [annotations:gen_function(A, redirect_here, Target) || A <- Aliases]}.
around_advice(#annotation{data=Target}, _M, F, _Inputs) ->
annotation:call_advised(Mod, Target, [F|Inputs]).
It would be nice if we could write an annotation handler that is used to generate code at compile time (or when runtime code (re)gen is being applied). The canonical use-case I have for this at the moment is to avoid this:
And instead to be able to do something like this:
such that the wrapper functions are generated for me. Quite what the callback/annotation handler module needs to look like isn't clear to me at the moment, but I suspect either a
generate_codefunction or maybe some meta-data to indicate that we want code-gen to occur would do: