Types 是否可以获取Erlang类型中可接受值的列表?

Types 是否可以获取Erlang类型中可接受值的列表?,types,erlang,enumeration,Types,Erlang,Enumeration,假设我定义了一个类型: -type yummy_foods() :: ice_cream | cake | cookies | spam. 这似乎是一个很好的方法来完成我在C中使用枚举所做的事情。我可以让Erlang使用透析器为我检查事情。但是假设我想列出所有美味的食物,并用它们做点什么。我如何得到这个: [ice_cream, cake, cookies, spam] 我不在乎点菜,只要一切都准备好了。或者,我是否遗漏了一些常见的Erlang习语,这些习语会使整个方法看起来很愚蠢?啊,我最

假设我定义了一个类型:

-type yummy_foods() :: ice_cream | cake | cookies | spam.
这似乎是一个很好的方法来完成我在C中使用枚举所做的事情。我可以让Erlang使用透析器为我检查事情。但是假设我想列出所有美味的食物,并用它们做点什么。我如何得到这个:

[ice_cream, cake, cookies, spam]

我不在乎点菜,只要一切都准备好了。或者,我是否遗漏了一些常见的Erlang习语,这些习语会使整个方法看起来很愚蠢?

啊,我最初的答案可能与此无关

要执行您所描述的操作,您必须从文件中的表单列表中检索类型定义,对其进行解析或让他人为您进行解析,如果它确实是联合类型,则检索元素并在列表中返回它们

如果您想从源代码处执行此操作,则需要以下内容:

get_abstract_code_from_src(Filename) ->
    get_abstract_code_from_src(Filename, init_opts()).

get_abstract_code_from_src(Filename, Opts) ->
    case compile:file(Filename, Opts) of
        {ok,_,Abs} -> {ok, Abs};
        Err -> Err
    end.

init_opts() -> [to_pp, binary, return_errors].
如果没有宏或希望避免包含标题,也可以使用以下方法获取表单:

epp_dodger:quick_parse_file(Filename).

原始答复:

您已经拥有:

-type yummy_foods() :: ice_cream | cake | cookies | spam.
您可以使用:

-type list_of_yummy_foods :: [yummy_foods()].

这将保证列表中不会有任何其他食物,但并不是说所有这些食物都会出现。

啊,我最初的答案可能与此无关

要执行您所描述的操作,您必须从文件中的表单列表中检索类型定义,对其进行解析或让他人为您进行解析,如果它确实是联合类型,则检索元素并在列表中返回它们

如果您想从源代码处执行此操作,则需要以下内容:

get_abstract_code_from_src(Filename) ->
    get_abstract_code_from_src(Filename, init_opts()).

get_abstract_code_from_src(Filename, Opts) ->
    case compile:file(Filename, Opts) of
        {ok,_,Abs} -> {ok, Abs};
        Err -> Err
    end.

init_opts() -> [to_pp, binary, return_errors].
如果没有宏或希望避免包含标题,也可以使用以下方法获取表单:

epp_dodger:quick_parse_file(Filename).

原始答复:

您已经拥有:

-type yummy_foods() :: ice_cream | cake | cookies | spam.
您可以使用:

-type list_of_yummy_foods :: [yummy_foods()].

这将保证列表中不会有任何其他的,而不是所有的这些食物都会在列表中。

在编译时使用解析转换来检索和转换表单,以便它们包含一个新函数
-spec yummy_foods()->[yummy_foods(),…]
甚至
-spec is yummy_foods(atom())->boolean()
。解析转换有点难写,而且文档记录也很糟糕,所以你需要潜伏在互联网上阅读其他解析转换是如何完成的


或者,您也可以通过执行以下操作来检查给定术语是否为美味食品:检查(MaybeYummyFood,yummy_food())其中
-键入yummy_food())::冰激凌、蛋糕、饼干、垃圾邮件

使用解析转换在编译时检索和转换表单,以便它们包含一个新函数
-spec yummy_foods()->[yummy_foods(),…]
甚至
-spec is yummy_food(atom())->boolean()
。解析转换有点难写,而且文档记录也很糟糕,所以你需要潜伏在互联网上阅读其他解析转换是如何完成的


或者,您也可以通过执行以下操作来检查给定术语是否为美味食品:检查(MaybeYummyFood,yummy_food())其中
-键入yummy_food())::冰激凌、蛋糕、饼干、垃圾邮件

我想如果你告诉我如何从文件中取出表单列表,我就能知道其余的。我想如果你告诉我如何从文件中取出表单列表,我就能知道其余的。