Dynamic operator in argument of macro function?

I have an operator in a variable, for example:

guard = &Kernel.>=/2

How can I use that variable as argument to a macro, e.g. for Ecto.Query.where/3?

Ecto.Query.where(query, [..., r], field(r, ^field) >= ^value)

I want to replace the operator hard-coded above by the one dynamically defined in the variable guard.

Looking at the code it seems like that’s not something you can do. A macro transforms AST at compile time, and you’re trying to gate it on something that exists only at runtime.

1 Like

How exactly you have to use variables in a macro depends on the Macro. You already see it in ecto where the names are used to build the query, except when you pin (^), then you use the variables value in the query.

Though, passing in the operator like that is not possible. I think you’ll have to limit yourt choices to a handfull of operators and branch on them, eg:

case op do
  :">=" -> Ecto.Query.where(query, [..., r], field(r, ^field) >= ^value)
  :"<" -> Ecto.Query.where(query, [..., r], field(r, ^field) < ^value)
end
1 Like