2

有没有办法在不查看源代码的情况下查看函数的守卫?

给定一个示例函数(在 Elixir 中):

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

在没有访问源代码的情况下,如何确定在 divide/2 上有一个守卫,以及如何找到有关该守卫的信息或该守卫对模式匹配的期望?

我在 Ruby Conf 2014 上观看了 Chris McCord(Elixir 的 Phoenix 框架的创建者)的演讲。在演讲中,Chris 正在描述守卫,有人问是否有一种方法可以检查函数以显示该函数的守卫。

这是谈话中的问题:

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

该问题在视频的 t= 时间后不久提出。

4

2 回答 2

5

目前,如果不查看来源,就无法自省这些信息。

于 2015-03-12T20:59:23.827 回答
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 的示例模块,它具有两个也称为 fact 的函数,您可以获得上述输出。

抽象代码中的子句将具有带有 atom op 的守卫。那些也可以检索。

于 2015-03-13T16:57:20.687 回答