2011-10-07 44 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來檢查給定的術語是否是美味的食物。

相關問題