anchor.diff:    {PatArgs, PatGuards}.
   
   %% -----------------------------------------------------------------------------
  -%% All of the code that follows was copied from the `v3_core'
  -%% module in the Erlang/OTP `compiler' application.
  -%%
  -%% Given a list of patterns, it generates the guards that apply to all of
  -%% them when considered together and it also transforms the patterns.
  +%% Internal Functions (code taken form `v3_core')
   %% -----------------------------------------------------------------------------
   
   pattern(#c_var{name='_', anno=Ann}, _) ->
  
positive.code: 
  -import(ordsets, [is_element/2, union/2, intersection/2, subtract/2]).
  
  fold_guards([]) ->
    cerl:abstract(true);
  fold_guards([Guard0]) ->
    Guard0;
  fold_guards([Guard0 | PatternGuards]) ->
    fold_guards(Guard0, PatternGuards).
  
  fold_guards(Guard0, PatternGuards) ->
    FoldGuards = fun(PatGuard, Guard) ->
                     Ann = cerl:get_ann(Guard),
                     cerl:ann_c_call(Ann
                                    , cerl:c_atom(erlang)
                                    , cerl:c_atom('and')
                                    , [PatGuard, Guard]
                                    )
                 end,
    lists:foldr(FoldGuards, Guard0, PatternGuards).
  
  -spec patterns([cerl:cerl()]) ->
    {[cerl:cerl()], [cerl:cerl()]}.
  
negative.code: %% @doc Utility functions for processing patterns in the Clojerl
  %% emitter.
  %%
  %% The code in this modules that does the actual work was copied from
  %% the `v3_core' module in the Erlang/OTP `compiler' application.
  %%
  %% Given a list of patterns, it generates the guards that apply to all of
  %% them when considered together and it also transforms the patterns.
  %%
  %% The exported functions present an API to facilitate the usage from
  %% `clj_emitter'.
  -module(clj_emitter_pattern).
  
  -export([ patterns/1
  