anchor.diff:      end;
   match_map([], _, Pbs, _) -> {yes,Pbs};
   match_map(_, _, _, _) -> erlang:error(illegal_pattern).
  -
  -map_pat_key(Key, _) ->
  -    eval_lit(Key, lfe_env:new()).               %Empty environment
   
   %% eval_lit(Literal, Env) -> Value.
   %%  Evaluate a literal expression. Error if invalid.
  
positive.code:     if P == Val -> {yes,Pbs};
         true -> no
      end;
  match([cons,H,T], [V|Vs], Pbs0, Env) ->        %Explicit cons constructor
      case match(H, V, Pbs0, Env) of
          {yes,Pbs1} -> match(T, Vs, Pbs1, Env);
          no -> no
      end;
  match([list|Ps], Val, Pbs, Env) ->        %Explicit list constructor
      match_list(Ps, Val, Pbs, Env);
  match([tuple|Ps], Val, Pbs, Env) ->
      %% io:fwrite("~p ~p\n", [Ps,Val]),
  
negative.code: %% match_map(Ps, Map, PatBindings, Env) -> {yes,PatBindings} | no.
  
  match_map([K,V|Ps], Map, Pbs0, Env) ->
      Pat = map_key(K),                           %Evaluate the key
      case maps:is_key(Pat, Map) of
          true ->
              case match(V, maps:get(Pat, Map), Pbs0, Env) of
  