Эрланг / эликсир стражи и арити

Есть ли способ увидеть охрану функции, не видя исходного кода?

Дан пример функции (в 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. Они также могут быть получены.

Другие вопросы по тегам