是否有可能获得Erlang类型的可接受值列表?
说我定义一个类型:是否有可能获得Erlang类型的可接受值列表?
-type yummy_foods() :: ice_cream | cake | cookies | spam.
这似乎是一个伟大的方式做什么,我会使用C语言进行枚举做,我可以有二郎检查就是为我用透析器。但是,我想要生成一份所有美味食品的清单,然后用它做点什么。我怎么会得到这个:
[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()].
这将保证没有别的将出现在列表中,虽然,并不是所有这些食物会。
我想如果你指出我如何从文件中得到表格列表,我可以找出其余的。 – nmichaels
我已更新我的原始答复。 – aronisstav
使用解析变换在编译时检索和转换表单,以便它们包含一个新函数-spec yummy_foods() -> [yummy_food(),...]
或甚至-spec is_yummy_food(atom()) -> boolean()
。解析转换是一种很难编写和严重记录的方式,因此您需要潜伏在Internet上并阅读其他解析转换是如何完成的。
或者,您也可以按照sheriff的开发,这将允许您通过执行IsYummyFood = sheriff:check(MaybeYummyFood, yummy_food())
其中-type yummy_food() :: ice_cream | cake | cookies | spam
来检查给定的术语是否是美味的食物。
总之,答案是否定的。 –