【问题标题】:Why do elixir guides say to use quote and unquote inside of a macro definition为什么长生不老药指南说在宏定义中使用引号和取消引号
【发布时间】:2019-07-01 17:18:59
【问题描述】:

我刚刚开始学习 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

我想知道为什么我们在定义自己的宏时需要使用quoteunquote 宏?

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

宏的第二个版本不会返回完全相同的答案吗?

我对宏的工作方式有什么误解吗?

【问题讨论】:

    标签: int elixir metaprogramming


    【解决方案1】:

    宏应该返回 AST。 AST 将直接注入到调用宏的地方。这将发生在编译阶段

    也就是说,后者将评估乘法的结果,在编译阶段将消息发送到stdout,并注入一个表示结果的常量来代替宏调用。这个宏只接受编译时常量,它不接受例如变量:

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

    前者将产生一个实际的 AST 用于评估

    【讨论】:

    • 啊。这就说得通了。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2016-12-31
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多