2011-10-07 46 views
0

说我定义一个类型:是否有可能获得Erlang类型的可接受值列表?

-type yummy_foods() :: ice_cream | cake | cookies | spam. 

这似乎是一个伟大的方式做什么,我会使用C语言进行枚举做,我可以有二郎检查就是为我用透析器。但是,我想要生成一份所有美味食品的清单,然后用它做点什么。我怎么会得到这个:

[ice_cream, cake, cookies, spam] 

我不在乎订购,只是一切都在那里。或者,我是否错过了一些常见的Erlang成语,这会使整个方法看起来很愚蠢?

+0

总之,答案是否定的。 –

回答

2

啊,我原来的答案很可能是无关紧要的......

要做到你所描述的,你要检索的文件表单列表类型定义,分析它,或有人分析它如果它确实是联合类型,则检索这些元素并将它们返回到列表中。

如果你想从源头做到这一点,你需要这样的:

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()]. 

这将保证没有别的将出现在列表中,虽然,并不是所有这些食物会。

+0

我想如果你指出我如何从文件中得到表格列表,我可以找出其余的。 – nmichaels

+0

我已更新我的原始答复。 – aronisstav

1

使用解析变换在编译时检索和转换表单,以便它们包含一个新函数-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来检查给定的术语是否是美味的食物。

相关问题