anchor.diff:  match_tuple([], _, _, Bs, _BBs) ->
       {match,Bs}.
   
  +match_map([{map_field, _, K, V}|Fs], Map, Bs0, BBs) ->
  +    Vm = try map:get(element(3,K),Map)
  +    catch error:_ -> throw(nomatch)
  +    end,
  +    {match, Bs} = match1(V, Vm, Bs0, BBs),
  +    match_map(Fs, Map, Bs, BBs);
  +match_map([], _, Bs, _) ->
  +    {match, Bs}.
  +
   %% match_list(PatternList, TermList, Bindings) ->
   %%	{match,NewBindings} | nomatch
   %%  Try to match a list of patterns against a list of terms with the
  
positive.code:     match_tuple(Elts, Tuple, 1, Bs, BBs);
  match1({tuple,_,_}, _, _Bs, _BBs) ->
      throw(nomatch);
  match1({bin, _, Fs}, <<_/bitstring>>=B, Bs0, BBs) ->
      eval_bits:match_bits(Fs, B, Bs0, BBs,
  			 match_fun(BBs),
  
negative.code:     erlang:raise(error, {undef_record,Name}, stacktrace());
  expr({record,_,_,Name,_}, _Bs, _Lf, _Ef, _RBs) ->
      erlang:raise(error, {undef_record,Name}, stacktrace());
  
  %% map
  expr({map_field,_,EK, EV}, Bs0, Lf, Ef, RBs) ->
      {value,K,Bs1} = expr(EK, Bs0, Lf, Ef, none),
      {value,V,Bs2} = expr(EV, Bs0, Lf, Ef, none),
      ret_expr({K,V}, merge_bindings(Bs1,Bs2), RBs);
  expr({map,_, Binding,Es}, Bs0, Lf, Ef, RBs) ->
      {value, Map0, Bs1} = expr(Binding, Bs0, Lf, Ef, RBs),
      {Vs,Bs} = expr_list(Es, Bs1, Lf, Ef),
      ret_expr(lists:foldl(fun({K,V}, Mi) -> map:put(K,V,Mi) end, Map0, Vs), Bs, RBs);
  expr({map,_,Es}, Bs0, Lf, Ef, RBs) ->
      {Vs,Bs} = expr_list(Es, Bs0, Lf, Ef),
      ret_expr(lists:foldl(fun({K,V}, Mi) -> map:put(K,V,Mi) end, map:new(), Vs), Bs, RBs);
  
  
  expr({block,_,Es}, Bs, Lf, Ef, RBs) ->
      exprs(Es, Bs, Lf, Ef, RBs);
  expr({'if',_,Cs}, Bs, Lf, Ef, RBs) ->
  