Ruby имеет открытые классы, которые очень удобны (хотя и оскорблены некоторыми), а Elixir сильно заимствует Ruby, поэтому я ожидал, что Elixir позволит мне снова открыть модуль и добавить к нему макросы после его закрытия, но это не помогло работайте так, как я пробовал. Есть ли способ сделать это? Эта функция доступна еще в Elixir?Открытые модули в Эликсире?
Чтобы сделать этот бетон, давайте возьмем пример из Криса МакКорд в Метапрограммирование эликсир:
defmodule Math do
defmacro say({:+, _, [lhs, rhs]}) do
quote do
lhs = unquote(lhs)
rhs = unquote(rhs)
result = lhs + rhs
IO.puts "#{lhs} plus #{rhs} is #{result}"
result
end
end
defmacro say({:*, _, [lhs, rhs]}) do
quote do
lhs = unquote(lhs)
rhs = unquote(rhs)
result = lhs * rhs
IO.puts "#{lhs} times #{rhs} is #{result}"
result
end
end
end
Если я затем добавить макрос для вычитания
defmodule Math do
defmacro say({:-, _, [lhs, rhs]}) do
quote do
lhs = unquote(lhs)
rhs = unquote(rhs)
result = lhs - rhs
IO.puts "#{lhs} minus #{rhs} is #{result}"
result
end
end
end
я получаю предупреждение, что я Переосмысление модуль Math, и изначально определенные макросы терпят неудачу. Поэтому очевидно, что мой подход не является правильным, но есть ли другой подход, который может достичь той же цели?
Не следует путать понятие класса с модулем. Хотя они имеют некоторое сходство, они далеки от того же. Например, в модуле Elixir нет таких данных, как личные данные. –
Кстати, ваш пример действительно не использует возможности макросов. Рекомендуется по возможности использовать функции, которые могут быть легко выполнены здесь. Просто используйте 'def' вместо' defmacro' и удалите все 'quote' и 'unquote'. –
Да, правда, но я надеюсь, вы понимаете, что это не совсем мой пример, это Крис МакКорд, и это «тривиальный» пример, просто используемый для демонстрационных целей. Тем не менее, ваш вопрос хорошо принят. – iconoclast