[erlang-questions] prettypr and spec

Roberto Ostinelli <>
Tue Sep 25 18:25:15 CEST 2012


Thank you Anthony, Ulf,

I'll definitely look into that. I just felt curious when I saw

-spec({{greetings, 1},
       [{type, 12, 'fun',
 [{type, 12, product,
   [{ann_type, 12,
     [{var, 12, 'Text'}, {type, 12, string, []}]}]},
  {type, 12, string, []}]}]}).

hem... ^^_

r.


On Tue, Sep 25, 2012 at 1:34 AM, Ulf Wiger <> wrote:

>
> Roberto,
>
> It appears as if erl_pp:form/1 does a much better job of formatting specs,
> but then, of course, you lose the comments.
>
> There is also an issue with typed record fields, which seems to affect
> erl_prettypr as well. It simply removes the types from record declarations.
>
> Take a look at parse_trans_pp:beam/1. It makes no effort to preserve
> comments
> (naturally, since it doesn't expect to find any), but handles specs and
> typed
> records correctly.
>
>
> https://github.com/uwiger/parse_trans/blob/master/src/parse_trans_pp.erl#L71
>
> This module, BTW, is also made to be used as an escript, and I have the
> following convenient alias:
>
> alias pp='escript /Users/uwiger/git/parse_trans/ebin/parse_trans_pp.beam'
>
> Not that the last point was particularly relevant to your particular
> problem. :)
>
> BR,
> Ulf W
>
> On 25 Sep 2012, at 06:00, Roberto Ostinelli wrote:
>
> I have this code:
>
> %%%%%%%%%%%%%%%%%%%%%%%%
> -module(mymodule).
> -export([hello/0, goodbye/0, greetings/1]).
>
> -spec hello() -> string().
> hello() ->
> greetings("hello").
>
> -spec goodbye() -> string().
> goodbye() ->
> greetings("goodbye").
>
> -spec greetings(Text::string()) -> string().
> greetings(Text) ->
>  lists:flatten(io_lib:format("~s sublimerl", [Text])).
>
> -ifdef(TEST).
> -include_lib("eunit/include/eunit.hrl").
>
> simple_test() ->
> ?assertEqual("hey sublimerl", greetings("hey")).
>
> greetings_test_() ->
> [?_assertEqual("hey sublimerl", greetings("hey"))].
>
> -endif.
> %%%%%%%%%%%%%%%%%%%%%%%%
>
>
> when i convert it using this:
>
>
> %%%%%%%%%%%%%%%%%%%%%%%%
> Formatted = case epp_dodger:parse_file(FilePath) of
>  {ok, Forms} ->
> case lists:keymember(error, 1, Forms) of
>  false ->
> erl_prettypr:format(erl_recomment:recomment_forms(Forms,
> erl_comment_scan:file(FilePath)));
>  true ->
> ""
>  end;
> {error, _} ->
>  ""
> end
> %%%%%%%%%%%%%%%%%%%%%%%%
>
>
> I get:
>
> %%%%%%%%%%%%%%%%%%%%%%%%
> -module(mymodule).
>
> -export([hello/0, goodbye/0, greetings/1]).
>
> -spec({{hello, 0},
>        [{type, 4, 'fun',
>  [{type, 4, product, []}, {type, 4, string, []}]}]}).
>
> hello() -> greetings("hello").
>
> -spec({{goodbye, 0},
>        [{type, 8, 'fun',
>  [{type, 8, product, []}, {type, 8, string, []}]}]}).
>
> goodbye() -> greetings("goodbye").
>
> -spec({{greetings, 1},
>        [{type, 12, 'fun',
>  [{type, 12, product,
>    [{ann_type, 12,
>      [{var, 12, 'Text'}, {type, 12, string, []}]}]},
>   {type, 12, string, []}]}]}).
>
> greetings(Text) ->
>     lists:flatten(io_lib:format("~s sublimerl", [Text])).
>
> -ifdef(TEST).
>
> -include_lib("eunit/include/eunit.hrl").
>
> simple_test() ->
>     ?assertEqual("hey sublimerl", (greetings("hey"))).
>
> greetings_test_() ->
>     [?_assertEqual("hey sublimerl", (greetings("hey")))].
>
> -endif.
> %%%%%%%%%%%%%%%%%%%%%%%%
>
>
> What happens to spec? What is the best way to use an erlang auto-formatter?
>
> Any input welcome.
>
> r.
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>
>
> Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.
> http://feuerlabs.com
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20120925/9666b61d/attachment.html>


More information about the erlang-questions mailing list