anchor.diff:  
   %% @doc Builds a tuple abstract form tagged with atom ?TYPE which is used
   %%      to build Clojerl data types.
  --spec type_tuple(atom(), [cerl:cerl()], [cerl:cerl()], create | match) ->
  +-spec type_tuple( atom()
  +                , [cerl:cerl()]
  +                , [cerl:cerl()]
  +                , [cerl:cerl()]
  +                , create | match
  +                ) ->
     cerl:cerl().
  -type_tuple(Typename, AllFieldsAsts, HiddenFieldsAsts, TupleType) ->
  +type_tuple(Typename, Anno, AllFieldsAsts, HiddenFieldsAsts, TupleType) ->
     {MapFieldType, InfoAst} = case TupleType of
                                 create -> {assoc, cerl:c_atom(?NIL)};
                                 match  -> {exact, new_c_var([])}
  
positive.code: 
    %% Expand the first argument to pattern match on all fields so that they are
    %% available in the functions scope.
    TypeTupleAst = type_tuple(Module, AllFieldsAsts, [], match),
    MethodsAsts1 = lists:map( fun(F) ->
                                  expand_first_argument(F, TypeTupleAst)
                              end
  
negative.code:   ok     = clj_module:ensure_loaded(Module, file_from(Env)),
  
    %% Attributes
    Attributes = [ { cerl:ann_c_atom(Anno, behavior)
                   , cerl:ann_abstract(Anno, [sym_to_kw(ProtocolName)])
                   }
                   || #{type := ProtocolName} <- ProtocolsExprs
                 ],
  
    %% Functions
    {AllFieldsAsts, State} = pop_ast( lists:foldl(fun ast/2, State0, FieldsExprs)
  