Если модуль сторонний и / или уже скомпилирован, обратитесь к ответу, предоставленному @Dogbert.
Если модуль принадлежит владельцу, запрошенная информация может быть собрана на этапе компиляции с помощью _1 _ крючок:
defmodule TestInfo do
def on_definition(_env, kind, name, args, guards, body) do
with {:ok, table} <- :dets.open_file(:test_info, type: :set) do
clauses =
case :dets.lookup(table, name) do
{:error, _reason} -> []
[] -> []
list when is_list(list) -> list[name]
end
:dets.insert(table, {name, [{kind, args, guards} | clauses]})
:dets.close(table)
end
end
end
defmodule Test do
@on_definition {TestInfo, :on_definition} # ⇐ THIS
def greet(name) when name == "foo" do
IO.puts("Hello, bar")
end
def greet(name), do: IO.puts("Hello, #{name}")
end
Теперь у вас есть все определения, хранящиеся в DETS:
{:ok, table} = :dets.open_file(:test_info, type: :set)
:dets.lookup(table, :greet)
#⇒ [
# greet: [
# {:def, [{:name, [line: 10], nil}], []},
# {:def, [{:name, [line: 6], nil}],
# [{:==, [line: 6], [{:name, [line: 6], nil}, "foo"]}]}]
# ]
:dets.close(table)
Я использовал DETS для хранения информации, потому что она хранится на этапе компиляции и обычно используется во время выполнения.
person
Aleksei Matiushkin
schedule
23.05.2018