2

ソースコードを見ずに関数のガードを見る方法はありますか?

与えられた関数の例 (Elixir):

def divide(x, y) when y != 0 do
  x / y
end

ソース コードにアクセスせずに、divide/2 にガードがあることをどのように判断するのでしょうか? また、そのガードに関する情報や、そのガードがパターン マッチに期待するものを見つけるにはどうすればよいでしょうか?

Ruby Conf 2014 で Chris McCord (Elixir の Phoenix Framework の作成者) の講演を見ていました。講演の中で Chris はガードについて説明していて、誰かが関数のガードを表示する関数を検査する方法があるかどうか尋ねました。

これはトークからの質問です:

https://www.youtube.com/watch?v=5kYmOyJjGDM&t=5188

ビデオの t= 時間の直後に質問されます。

4

2 に答える 2

0

ビーム ファイルにデバッグ情報がある場合は、ソース コードを調べることなく、それを解析して必要なものを取得するライブラリを作成できます。以下は、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 という名前の 2 つの関数を持つ、fact という名前のサンプル モジュールの場合、上記の出力を取得できます。

抽象コードの節には、atom op によるガードがあります。それらも取得できます。

于 2015-03-13T16:57:20.687 に答える