Эрланг / эликсир стражи и арити
Есть ли способ увидеть охрану функции, не видя исходного кода?
Дан пример функции (в Elixir):
def divide(x, y) when y != 0 do
x / y
end
Как можно выяснить, что существует защита на div /2 без доступа к исходному коду, и как найти информацию об этом охраннике или о том, что ожидает этот защитник для сопоставления с образцом?
Я смотрел лекцию Криса МакКорда (создателя Phoenix Framework от Elixir) из Ruby Conf 2014. Во время лекции Крис описывал охрану, и кто-то спросил, есть ли способ проверить функцию, которая покажет охрану функции.
Это вопрос из разговора:
https://www.youtube.com/watch?v=5kYmOyJjGDM&t=5188
Вопрос задается вскоре после t= time видео.
2 ответа
В настоящее время невозможно проанализировать эту информацию, не глядя на источник.
Если в файле луча есть отладочная информация, можно создать библиотеку, которая будет анализировать ее и получать то, что вам нужно, не заглядывая в исходный код. Вот один пример в Erlang, как вы можете получить арности функции.
1> GetArities =
fun(Module, FunName) ->
{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Module,[abstract_code]),
lists:foldl(
fun({function, _Line, Fun, Arity, _Clauses}, FunArities) when Fun == FunName ->
[Arity | FunArities];
(_, FunArities) ->
FunArities
end, [], AC)
end.
2> GetArities(fact,fact).
[1,0]
Для примера модуля с именем fact с двумя функциями, также называемыми fact, вы можете получить приведенный выше вывод.
Пункты в абстрактном коде будут иметь охранники с атомом op. Они также могут быть получены.