anchor.diff:    Env1        = clj_env:add_locals_scope(Env),
     Env2        = clj_env:put_locals(Env1, FieldsExprs),
   
  -  %% HACK: by emitting the tyep we make the module available, which means the
  +  %% HACK: by emitting the type we make the module available, which means the
     %% type gets resolved. But we remove all protocols and methods, thus
     %% generating just a dummy erlang module for the type.
     DeftypeDummyExpr = #{ op        => deftype
  
positive.code: 
  -spec analyze_invoke(clj_env:env(), 'clojerl.List':type()) -> clj_env:env().
  analyze_invoke(Env, Form) ->
    Env1 = analyze_form(Env, clj_core:first(Form)),
  
    Args = clj_core:rest(Form),
    Env2 = analyze_forms(Env1, clj_core:to_list(Args)),
  
    ArgCount = clj_core:count(Args),
    {ArgsExpr, Env3} = clj_env:last_exprs(Env2, ArgCount),
    {FExpr, Env4} = clj_env:pop_expr(Env3),
  
    InvokeExpr = #{ op   => invoke
                  , env  => ?DEBUG(Env4)
                  , form => Form
                  , f    => FExpr#{arity => ArgCount}
                  , args => ArgsExpr
                  },
    clj_env:push_expr(Env4, InvokeExpr).
  
  %%------------------------------------------------------------------------------
  %% Analyze symbol
  
negative.code: -spec maybe_type_tag('clojerl.Symbol':type()) -> ?NIL | module().
  maybe_type_tag(Symbol) ->
    Meta = clj_core:meta(Symbol),
    case clj_core:get(Meta, tag) of
      ?NIL -> ?NIL;
      Tag  -> clj_core:keyword(Tag)
    end.
  
  -spec type_tag(map()) -> ?NIL | module().
  