anchor.diff:  expand_try(Meta, {'rescue', _} = Rescue, E) ->
     expand_without_export(Meta, 'try', fun expand_rescue/3, Rescue, E);
   expand_try(Meta, {Key, _}, E) ->
  -  compile_error(Meta, ?key(E, file), "unexpected keyword ~ts in try", [Key]).
  +  form_error(Meta, ?key(E, file), ?MODULE, {unexpected_keyword, 'try', Key}).
   
   expand_catch(_Meta, [_] = Args, E) ->
     head(Args, E);
   expand_catch(_Meta, [_, _] = Args, E) ->
     head(Args, E);
   expand_catch(Meta, _, E) ->
  -  compile_error(Meta, ?key(E, file), "expected one or two args for catch clauses (->) in try").
  +  form_error(Meta, ?key(E, file), ?MODULE, {wrong_number_of_args_for_clause, "one or two args", 'try', 'catch'}).
   
   expand_rescue(Meta, [Arg], E) ->
     case expand_rescue(Arg, E) of
       {EArg, EA} ->
         {[EArg], EA};
       false ->
  -      compile_error(Meta, ?key(E, file), "invalid rescue clause. The clause should "
  -        "match on an alias, a variable or be in the \"var in [alias]\" format")
  +      form_error(Meta, ?key(E, file), ?MODULE, invalid_rescue_clause)
     end;
   expand_rescue(Meta, _, E) ->
  -  compile_error(Meta, ?key(E, file), "expected one arg for rescue clauses (->) in try").
  +  form_error(Meta, ?key(E, file), ?MODULE, {wrong_number_of_args_for_clause, "one arg", 'try', 'rescue'}).
   
   %% rescue var
   expand_rescue({Name, _, Atom} = Var, E) when is_atom(Name), is_atom(Atom) ->
  
positive.code:   Fun = expand_one(Meta, 'cond', 'do', fun elixir_expand:expand_args/2),
    expand_with_export(Meta, 'cond', Fun, Do, Acc, E);
  expand_cond(Meta, {Key, _}, _Acc, E) ->
    compile_error(Meta, ?key(E, file), "unexpected keyword ~ts in cond", [Key]).
  
  %% Receive
  
  'receive'(Meta, [], E) ->
    compile_error(Meta, ?key(E, file), "missing do or after keyword in receive");
  'receive'(Meta, Opts, E) when not is_list(Opts) ->
    compile_error(Meta, ?key(E, file), "invalid arguments for receive");
  'receive'(Meta, Opts, E) ->
    RaiseError = fun(Kind) ->
      compile_error(Meta, ?key(E, file), "duplicated ~ts clauses given for receive", [Kind])
    end,
    ok = assert_at_most_once('do', Opts, 0, RaiseError),
    ok = assert_at_most_once('after', Opts, 0, RaiseError),
  
negative.code:   {ELeft, EL}  = Fun(Left, E),
    {ERight, ER} = elixir_expand:expand(Right, EL#{export_vars := ExportVars}),
    {{'->', Meta, [ELeft, ERight]}, ER};
  clause(Meta, Kind, _Fun, _, E) ->
    form_error(Meta, ?key(E, file), ?MODULE, {bad_or_missing_clauses, Kind}).
  
  head([{'when', Meta, [_, _ | _] = All}], E) ->
    {Args, Guard} = elixir_utils:split_last(All),
  