Это происходит потому, что конструкция do
... end
является своеобразным кусочком синтаксического сахара.Например, это:
def toto(p) do
IO.inspect p
end
эквивалентно:
def toto(p), do: IO.inspect p
, которое, поскольку ключевые слова в конце аргумента передаются в виде списка ключевых слов, эквивалентно:
def(toto(p), [do: IO.inspect(p)])
Поскольку ваш макрос defverified
ожидает только блок do
и никаких других параметров ключевого слова, мы можем явно сопоставить фактическое тело:
defmacro defverified(sign, [do: body]) do
...
Перед этим последнийФорма в функции toto
буквально будет иметь вид:
[do: IO.inspect param]
, который будет вызывать IO.inspect
, как ожидается, но затем будет возвращать список ключевых слов вместо простого значения.