【问题标题】:Elixir quote vs escapeElixir 报价与逃生
【发布时间】:2022-05-07 23:54:21
【问题描述】:

在 Elixir 中,什么时候应该使用 Macro.escape/1 而不是 quote/1?我查看了beginner's guide 并没有帮助。

【问题讨论】:

  • Elixir 中没有Kernel.escape/1。应该使用quote 从源代码中获取 AST。
  • 他的意思是Macro.escape/1。
  • 我是否可以谦虚地建议,如果您正在查看初学者指南,您可能希望推迟尝试使用 Elixir 宏,直到您更好地掌握该语言?
  • @OnorioCatenacci 我对语言有很好的掌握;初学者指南仍然提供比其他文档更多的解释。鉴于它有一个关于宏的部分,你的建议有点像第 22 条规则。

标签: macros escaping elixir quote


【解决方案1】:

quote/2 返回传入的代码块的abstract syntax tree (AST)。

Macro.escape/2 返回传入的值的AST。

这是一个例子:

iex(1)> a = %{"apple": 12, "banana": 90}
%{apple: 12, banana: 90}

iex(2)> b = quote do: a
{:a, [], Elixir}

iex(3)> c = Macro.escape(a)
{:%{}, [], [apple: 12, banana: 90]}

quote/2 将保留原始变量a,而Macro.escape/2 会将a 的值注入返回的 AST。

iex(4)> Macro.to_string(b) |> Code.eval_string

  warning: variable "a"  does  not exist and is being
  expanded to "a()", please use parentheses to remove
  the ambiguity or change the variable name
    nofile:1

iex(5)> Macro.to_string(c) |> Code.eval_string
{%{apple: 12, banana: 90}, []}

iex(6)> Macro.to_string(b) |> Code.eval_string([a: "testvalue"])
{"testvalue", [a: "testvalue"]}

为了完整起见:

iex(1)> a = %{"apple": 12, "banana": 90}
%{apple: 12, banana: 90}

iex(3)> Macro.escape(a)
{:%{}, [], [apple: 12, banana: 90]}

iex(2)> quote do: %{"apple": 12, "banana": 90}
{:%{}, [], [apple: 12, banana: 90]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2012-02-11
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2014-08-28
    相关资源
    最近更新 更多