[erlang-questions] Accessing 'spec' information at runtime
Michael Truog
mjtruog@REDACTED
Tue Mar 8 18:05:49 CET 2011
There is already code for this:
https://github.com/okeuday/CloudI/blob/master/src/lib/unused/src/abstract_code.erl
An example is:
2> test:function(a).
[{attribute,1,file,{"./test.erl",1}},
{attribute,1,module,test},
{attribute,4,export,[{function,1}]},
{attribute,6,spec,
{{function,1},
[{type,6,'fun',
[{type,6,product,
[{ann_type,6,[{var,6,'A'},{type,6,any,[]}]}]},
{type,6,any,[]}]}]}},
{function,7,function,1,
[{clause,7,
[{var,7,'A'}],
[],
[{call,8,
{remote,8,{atom,8,io},{atom,8,format}},
[{string,8,"~p~n"},
{cons,8,
{call,8,{atom,8,'$abstract_code$'},[]},
{nil,8}}]},
{var,9,'A'}]}]},
{eof,10}]
For the code:
-module(test).
-compile({parse_transform, abstract_code}).
-export([function/1]).
-spec function(A::any()) -> any().
function(A) ->
io:format("~p~n", ['$abstract_code$'()]),
A.
On 03/08/2011 08:00 AM, Eric Merritt wrote:
> I think that is an extraordinarily good idea Kenneth. Having that
> information be a first class chunk would be useful.
>
> How do record type specs appear. I suspect they are part of the
> abstract code for the record.
>
> On Tue, Mar 8, 2011 at 9:48 AM, Kenneth Lundin <kenneth.lundin@REDACTED> wrote:
>> The -spec and -type is included in the abstract_code chunk in the beam
>> files. If
>> they are compiled to contain debug_info (erlc +debug_info my_module.erl).
>>
>> The appear as attributes and the can be abstracted like this (only the
>> -spec(s) in this example):
>>
>> %% Beam is a string contaning the path to a beam file i.e
>> "/home/user/mymodule.beam"
>> %% you can for example call it like this from the shell:
>> %% m:getspecs(code:which(lists)).
>>
>> getspecs(Beam)->
>> {ok,{_,[{abstract_code,{_,AC}}]}} =
>> beam_lib:chunks(Beam,[abstract_code]),
>> Specs = [Spec|| Spec = {attribute,_,'spec',{FA,_}} <- AC],
>> io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(Specs))]).
>>
>> Hmm, just thinking. Maybe it would be a good idea to have the -spec
>> info available as a separate
>> chunk who is always present even without debug_info.
>> The -spec info could for example be used for a smarter tab-completion
>> of functions in the shell.
>> Including argument names and types.
>>
>> /Kenneth, Erlang/OTP Ericsson
>>
>> On Tue, Mar 8, 2011 at 3:41 PM, Eric Merritt <ericbmerritt@REDACTED> wrote:
>>> Hello All,
>>>
>>>
>>> I have been doing some digging and it I haven't found anything that
>>> indicates that spec information survives compilation. It may in the
>>> beam files, but there isn't any documentation to support that
>>> assumption in beam_lib. So before I go digging in the source I thought
>>> I would ping the list and see if anyone has any ideas on accessing
>>> 'speced' type information at run time.
>>>
>>> Thanks,
>>> Eric
>>>
>>> ________________________________________________________________
>>> erlang-questions (at) erlang.org mailing list.
>>> See http://www.erlang.org/faq.html
>>> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
>>>
>>>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:erlang-questions-unsubscribe@REDACTED
>
>
More information about the erlang-questions
mailing list