Почему гиды эликсира говорят использовать кавычки и кавычки внутри определения макроса - PullRequest
0 голосов
/ 07 февраля 2019

Я только начал изучать макросы в эликсире.В настоящее время я читаю книгу metaprogramming-elixir.

В самом начале книги приведен пример создания макроса с именем say.Этот макрос примет выражение типа 5 + 5 и вернет строку "5 plus 5 is 10" ...

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

Мне интересно, почему мы должны использовать макросы quote и unquote, когда мыопределение нашего собственного макроса?

defmacro say({:+, _, [lhs, rhs]}) do
  result = lhs * rhs
  IO.puts "#{lhs} plus #{rhs} is #{result}"
  result
end

Разве вторая версия макроса не возвращает тот же самый ответ?

Есть ли что-то, что я неправильно понимаю, как работают макросы?

1 Ответ

0 голосов
/ 07 февраля 2019

Макросы должны возвращать AST.AST будет введен непосредственно в то место, откуда был сделан вызов макроса.Это произойдет на этапе компиляции .

При этом последний оценит результат умножения, поместит сообщение в stdout на этапе компиляции и введетконстанта, представляющая результат, вместо вызова макроса.Этот макрос будет принимать только константы времени компиляции, он не будет принимать, например, переменные:

say(5 + 5)                       # works
with foo <- 5, do: say(foo + 5)  # raises

Первый из них будет производить фактическое AST для оценки .

...