Я работаю над макросом, чтобы динамически генерировать анонимные функции. Функция должна иметь 2 предложения. Первое предложение возвращает TRUE, когда охранник выполняется. В то время как второй - это значение по умолчанию, которое вернет FALSE, если нет совпадения с первым предложением. Например:Как создать анонимную функцию с защитой с помощью макросов?
fn
xfield when xfield > 2 -> true
_ -> false
end
Вот мой прототип макроса
defmacro condition_function(field, guard) do
clause1 = quote do: (unquote(field) when unquote(guard) -> true)
clause2 = quote do: (_ -> false)
fun_clauses = clause1 ++ clause2
{:fn, [], fun_clauses}
end
Проблема заключается в том, что первое условие никогда не совпадают. Это тот ввод, который я использовал для проверки моего макроса в REPL RE:
iex(84)> myfield = quote do: xfield
{:xfield, [], Elixir}
iex(85)> myguard = quote do: xfield > 2
{:>, [context: Elixir, import: Kernel], [{:xfield, [], Elixir}, 2]}
iex(86)> myFun = Builder.condition_function(myfield, myguard)
#Function<6.50752066/1 in :erl_eval.expr/5>
iex(87)> myFun.(2)
false
iex(88)> myFun.(5)
false
Любые предложения?
Спасибо заранее, Умберто
Спасибо за ваш кончик и время Это мой первый раз, работая с Elixir's Macro System – Humberto
Я тестировал тело моей макрофункции на iex, и я получаю правильный АСТ. Я не сейчас, что мне не хватает в моей макрофункции :( – Humberto
Я использую этот [пост] (http: //stackoverflow.com/questions/24849774/creating-anonymous-functions-via-macros) в качестве руководства, но кажется, что я делаю что-то неправильно – Humberto