anchor.diff:               , clj_env:location(Env0)
                ),
   
  +  %% When in a let or loop form binding context, bindings with the
  +  %% same name as other bindings or locals should be shadowed.
  +  %% This will avoid Erlang's single assignment behaviour
  +  %% (which is not how Clojure works), and avoid conflicts with
  +  %% variables with the same name (which the Core Erlang linter
  +  %% complains about).
  +  Shadow = case clj_env:get(is_binding_context, false, Env0) of
  +             true  -> clj_env:get_local(Symbol, Env0);
  +             false -> ?NIL %% Don't shadow
  +           end,
  +
     Expr0 = #{ op         => local
              , env        => Env0
              , form       => Symbol
              , tag        => ?NO_TAG
              , name       => Symbol
  -           , shadow     => clj_env:get_local(Symbol, Env0)
  +           , shadow     => Shadow
              , underscore => is_underscore(Symbol)
              , id         => erlang:unique_integer()
              },
  
positive.code:                    false -> 'let'
                   end,
  
    {PatternExpr, Env1} = clj_env:pop_expr(parse_pattern(Pattern, Env0)),
    {InitExpr, Env2}    = clj_env:pop_expr(analyze_form(Init, Env1)),
  
    BindExpr = #{ op      => binding
                , env     => Env0
  
negative.code:   {Expr1, Env2} = add_type_tag(Symbol, Expr0, Env1),
    clj_env:push_expr(Expr1, Env2).
  
  -spec do_analyze_symbol(boolean(), 'clojerl.Symbol':type(), clj_env:env()) ->
    {expr(), clj_env:env()}.
  do_analyze_symbol(true = _InPattern, Symbol, Env0) ->
    ?ERROR_WHEN( not is_valid_bind_symbol(Symbol)
  