我正在尝试扩展Erlang混音器库(https://github.com/opscode/mixer)以传递“-spec()”。它添加到模块的函数的行。但是我不清楚erlc如何将规范放入核心erlang代码中。
我从一个非常简单的(测试)模块开始:
-module(mix1).
-export([square/1]).
-spec(square(number()) -> number()).
square(X) -> X * X.
用“erlc + debug_info -S mix1.erl”编译它并得到了这个(删除了module_info函数):
{module, mix1}. %% version = 0
{exports, [{module_info,0},{module_info,1},{square,1}]}.
{attributes, []}.
{labels, 7}.
{function, square, 1, 2}.
{label,1}.
{line,[{location,"mix1.erl",7}]}.
{func_info,{atom,mix1},{atom,square},1}.
{label,2}.
{line,[{location,"mix1.erl",8}]}.
{gc_bif,'*',{f,0},1,[{x,0},{x,0}],{x,0}}.
return.
我想弄清楚“-spec()”是如何翻译的,我在那里看不到它们,有什么想法吗?我错过了什么这里的最终目标是将其用于解析变换。
答案 0 :(得分:1)
我相信你的输出不完全是AST,而是AST的一些标准化形式。
{ok, Forms} = epp:parse_file("mix1.erl",[],[]).
{ok,[{attribute,1,file,{"mix1.erl",1}},
{attribute,1,module,mix1},
{attribute,2,export,[{square,1}]},
{attribute,3,spec,
{{square,1},
[{type,3,'fun',
[{type,3,product,[{type,3,number,[]}]},
{type,3,number,[]}]}]}},
{function,4,square,1,
[{clause,4,
[{var,4,'X'}],
[],
[{op,4,'*',{var,4,'X'},{var,4,'X'}}]}]},
{eof,6}]}