Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 为什么错误在错误的线路上?_Macros_Elixir - Fatal编程技术网

Macros 为什么错误在错误的线路上?

Macros 为什么错误在错误的线路上?,macros,elixir,Macros,Elixir,我正在潜入克里斯·麦考德的作品中 我在键入一个示例时犯了拼写错误: defmodule Math do defmacro say({:+, _, [lhs, rhs]}) do qoute do #spelling mistake (swapped "o" and "u") lhs = unquote(lhs) #(CompileError) math.exs:4: undefined function lhs/0 rhs = unqu

我正在潜入克里斯·麦考德的作品中

我在键入一个示例时犯了拼写错误:

defmodule Math do
  defmacro say({:+, _, [lhs, rhs]}) do
    qoute do             #spelling mistake (swapped "o" and "u")
      lhs = unquote(lhs) #(CompileError) math.exs:4: undefined function lhs/0
      rhs = unquote(rhs)
      result = lhs + rhs
      IO.puts "#{lhs} plus #{rhs} is #{result}"
      result
    end
  end

  defmacro say({:*, _, [lhs, rhs]}) do
    qoute do #spelling mistake copied
      lhs = unquote(lhs)
      rhs = unquote(rhs)
      result = lhs * rhs
      IO.puts "#{lhs} times #{rhs} is #{result}"
      result
    end
  end
end
在shell中,错误是有意义的:

iex(1)> qoute do: 1 + 2 #spelling mistake
** (RuntimeError) undefined function: qoute/1
iex(1)> unquote do: 1
** (CompileError) iex:1: unquote called outside quote
为什么编译此文件会在下一行出现错误?我的拼写错误是正确的吗

如果我删除
unquote
,错误将出现在正确的文件中

defmodule Math do
  defmacro say({:+, _, [lhs, rhs]}) do
    qoute do             #function qoute/1 undefined
      result = lhs + rhs
      IO.puts "#{lhs} plus #{rhs} is #{result}"
      result
    end
  end
...

为什么使用
unquote
会将错误移到其他地方?

这是因为一旦调用
qoute/1
,Elixir会假定它是稍后定义的函数,并继续将代码编译为函数调用。然而,当我们试图编译它时,我们会看到一个unquote,假设有一个外部定义的变量,当它没有定义时,一切都会崩溃

我们没有办法解决这个问题,因为错误发生在我们扩展代码时,而quote/unquote也被扩展时