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 maybe_type_tag('clojerl.Symbol':type()) -> ?NIL | module().
  maybe_type_tag(Symbol) ->
    Meta = clj_core:meta(Symbol),
    Tag  = clj_core:get(Meta, tag),
    case is_maybe_type(Tag) of
      true  -> clj_core:keyword(Tag);
      false -> ?NIL
    end.
  
  -spec type_tag(map()) -> ?NIL | module().
  
negative.code: %%------------------------------------------------------------------------------
  
  -spec wrapping_meta(clj_env:env(), map()) -> clj_env:env().
  wrapping_meta(Env, #{form := Form, tag := Tag} = Expr) ->
    Meta = case clj_core:'meta?'(Form) of
             true  -> clj_reader:remove_location(clj_core:meta(Form));
             false -> ?NIL
           end,
    case Meta of
      Meta when Meta =/= ?NIL andalso Meta =/= #{} ->
        {MetaExpr, Env1} = clj_env:pop_expr(analyze_form(Env, Meta)),
        WithMetaExpr = #{ op   => with_meta
                        , env  => ?DEBUG(Env)
                        , form => Form
                        , tag  => Tag
                        , meta => MetaExpr
                        , expr => Expr
                        },
  