TLDR: Использование location:: keep .
Вы можете определить quote
внутри макроса, например:
defmodule Test do
defmacro my_quote do
quote do
IO.puts "line 1"
IO.puts "line 2"
5/0
end
end
def try_quote do
my_quote() # Line 11
end
end
Теперь звоним Test.try_quote
:
iex(7)> Test.try_quote
line 1
line 2
** (ArithmeticError) bad argument in arithmetic expression
test.exs:11: Test.try_quote/0
Таким образом, мы получаем строку, где была названа цитата, что лучше, но еще не то, что мы хотели.
Решение тогдаможно использовать макрос для определения функции для нас, например:
defmodule TestMacro do
defmacro my_quote do
quote do
def my_function do
IO.puts "line 1"
IO.puts "line 2"
5/0 # Line 7
end
end
end
end
defmodule Test do
import TestMacro
my_quote # Line 15
end
Теперь вызов Test.my_function
дает нам:
line 1
line 2
** (ArithmeticError) bad argument in arithmetic expression
test.exs:15: Test.my_function/0
То есть строка, в которой макросназывался!Но теперь, если мы изменим определение кавычки (строка 3) на
quote location: :keep do
Мы, наконец, получим точную строку, где происходит ошибка:
line 1
line 2
** (ArithmeticError) bad argument in arithmetic expression
test.exs:7: Test.my_function/0