do ... end
не обязательно является функциональным телом.Это общий синтаксис, который при использовании с макросом передает AST (абстрактное синтаксическое дерево) своего содержимого в макрос.Вот демонстрация:
defmodule A do
defmacro a(args) do
IO.inspect args
end
def main do
a do
1 + 2
end
end
end
A.main
Вывод:
[do: {:+, [line: 8], [1, 2]}]
Так что это просто AST тела блока, переданного в виде списка ключевых слов с ключом do
.
create
- это просто макрос, который принимает два аргумента: первый - таблица, а второй - блок do ... end
.Макрос затем преобразует блок и выполняет его.Вы можете увидеть исходный код функции для более подробной информации.