anchor.diff:      Env;
   bind_recursive(Ks, Vs, F, Env) ->
       F1 = fun (V) ->
  -		 fun (Dict) -> F(V, [{rec, Dict, Dict} | Env]) end
  +		 fun (Map) -> F(V, [{rec, Map, Map} | Env]) end
   	 end,
  -    Dict = bind_recursive_1(Ks, Vs, F1, dict:new()),
  -    [{rec, Dict, Dict} | Env].
  -
  -bind_recursive_1([K | Ks], [V | Vs], F, Dict) ->
  -    bind_recursive_1(Ks, Vs, F, dict:store(K, F(V), Dict));
  -bind_recursive_1([], [], _, Dict) ->
  -    Dict.
  +    Map = bind_recursive_1(Ks, Vs, F1, #{}),
  +    [{rec, Map, Map} | Env].
  +
  +bind_recursive_1([K | Ks], [V | Vs], F, Map) ->
  +    bind_recursive_1(Ks, Vs, F, maps:put(K, F(V), Map));
  +bind_recursive_1([], [], _, Map) ->
  +    Map.
   
   
   %% =====================================================================
  
positive.code: 	false ->
  	    is_defined(Key, Env)
      end;
  is_defined(Key, [{rec, Dict, _Dict0} | Env]) ->
      dict:is_key(Key, Dict) orelse is_defined(Key, Env).
  
  
  %% =====================================================================
  
negative.code: 
  -spec delete(term(), environment()) -> environment().
  
  delete(Key, [{map, Map} = E | Env]) ->
      case maps:take(Key, Map) of
  	{_, Map1} ->
  	    [{map, Map1} | Env];
  	error ->
  	    delete_1(Key, Env, E)
      end;
  delete(Key, [{rec, Map, Map0} = E | Env]) ->
      case maps:take(Key, Map) of
  	{_, Map1} when map_size(Map1) =:= 0 ->
  	    Env; % the whole {rec,...} is now garbage
  	%% The Map0 component must be preserved as it is until all
  	%% keys in Map have been deleted.
  	{_, Map1} ->
  	    [{rec, Map1, Map0} | Env];
  	error ->
  	    [E | delete(Key, Env)]
      end.
  
  %% This is just like above, except we pass on the preceding 'map'
  %% mapping in the list to enable merging when removing 'rec' mappings.
  
  delete_1(Key, [{rec, Map, Map0} = E | Env], E1) ->
      case maps:take(Key, Map) of
  	{_, Map1} when map_size(Map1) =:= 0 ->
  	    concat(E1, Env);
  	{_, Map1} ->
  	    [E1, {rec, Map1, Map0} | Env];
  	error ->
  	    [E1, E | delete(Key, Env)]
      end.
  
  concat({map, M1}, [{map, M2} | Env]) ->
      [maps:merge(M2, M1) | Env];
  concat(E1, Env) ->
      [E1 | Env].
  
  