anchor.diff:  
   -spec special_forms() -> #{'clojerl.Symbol':type() => fun() | undefined}.
   special_forms() ->
  -  #{
  -     symbol(<<"ns">>)       => fun parse_ns/2,
  -     symbol(<<"def">>)      => fun parse_def/2,
  -     symbol(<<"quote">>)    => fun parse_quote/2,
  -     symbol(<<"fn*">>)      => fun parse_fn/2,
  -     symbol(<<"do">>)       => fun parse_do/2,
  -     symbol(<<"if">>)       => fun parse_if/2,
  -     symbol(<<"let*">>)     => fun parse_let/2,
  -     symbol(<<"loop*">>)    => fun parse_loop/2,
  -
  -     symbol(<<"recur">>)    => undefined,
  -     symbol(<<"case*">>)    => undefined,
  -     symbol(<<"letfn*">>)   => undefined,
  -     symbol(<<"var">>)      => undefined,
  -     symbol(<<"import*">>)  => undefined,
  -     symbol(<<"deftype*">>) => undefined,
  -     symbol(<<"reify*">>)   => undefined,
  -     symbol(<<"try">>)      => undefined,
  -     %% symbol(<<"monitor-enter">>),
  -     %% symbol(<<"monitor-exit">>),
  -     %% symbol(<<"new">>),
  -     %% symbol(<<"&">>),
  -     symbol(<<"throw">>)    => undefined,
  -     symbol(<<"catch">>)    => undefined,
  -     symbol(<<"finally">>)  => undefined
  +  #{ clj_core:symbol(<<"ns">>)       => fun parse_ns/2
  +   , clj_core:symbol(<<"def">>)      => fun parse_def/2
  +   , clj_core:symbol(<<"quote">>)    => fun parse_quote/2
  +   , clj_core:symbol(<<"fn*">>)      => fun parse_fn/2
  +   , clj_core:symbol(<<"do">>)       => fun parse_do/2
  +   , clj_core:symbol(<<"if">>)       => fun parse_if/2
  +   , clj_core:symbol(<<"let*">>)     => fun parse_let/2
  +   , clj_core:symbol(<<"loop*">>)    => fun parse_loop/2
  +
  +   , clj_core:symbol(<<"recur">>)    => undefined
  +   , clj_core:symbol(<<"case*">>)    => undefined
  +   , clj_core:symbol(<<"letfn*">>)   => undefined
  +   , clj_core:symbol(<<"var">>)      => undefined
  +   , clj_core:symbol(<<"import*">>)  => undefined
  +
  +   , clj_core:symbol(<<"deftype*">>) => undefined
  +   , clj_core:symbol(<<"reify*">>)   => undefined
  +
  +   , clj_core:symbol(<<"throw">>)    => undefined
  +   , clj_core:symbol(<<"try">>)      => undefined
  +   , clj_core:symbol(<<"catch">>)    => undefined
  +   , clj_core:symbol(<<"finally">>)  => undefined
  +
  +     %% , clj_core:symbol(<<"monitor-enter">>)
  +     %% , clj_core:symbol(<<"monitor-exit">>)
  +     %% , clj_core:symbol(<<"new">>)
  +     %% , clj_core:symbol(<<"&">>)
      }.
   
   -spec analyze_forms(clj_env:env(), [any()]) -> clj_env:env().
  
positive.code: 
  -spec parse_fn(clj_env:env(), 'clojerl.List':type()) -> clj_env:env().
  parse_fn(Env, List) ->
    Op = first(List),
    {Name, Methods} =
      case 'symbol?'(second(List)) of
        true -> {second(List), rest(rest(List))};
        false -> {undefined, rest(List)}
      end,
    MethodsList = case clj_core:'vector?'(first(Methods)) of
                    true -> [Methods];
                    false -> 'clojerl.List':to_list(Methods)
                  end,
  
negative.code: 
  -spec macroexpand_1(clj_env:env(), 'clojerl.List':type()) -> any().
  macroexpand_1(Env, Form) ->
    Op = clj_core:first(Form),
    {MacroVar, Env} = lookup_var(Op, false, Env),
    case
      is_special(Op)
      orelse (not clj_core:'symbol?'(Op))
      orelse (MacroVar == undefined)
      orelse (not 'clojerl.Var':is_macro(MacroVar))
    of
      true -> Form;
      false ->
        {MacroVar, Env} = lookup_var(Op, false, Env),
        Fun = clj_core:deref(MacroVar),
        Args = [Form, Env, clj_core:rest(Form)],
        erlang:apply(Fun, Args)
    end.
  
  