anchor.diff:       ,{"a:b(X,y)when is_atom(Y)",
          unbound_variable}
        ,{"x:c([string])",
  -       {syntax_error,no_lists_in_args}}
  +       {syntax_error,"lists not allowed in arg list"}}
        ,{"x(s)",
          this_is_too_confusing}
  +     ,{"x:c(S)when S==x;S==y",
  +       {syntax_error,"syntax error before: S"}}
  +     ,{"x:y(z)->bla",
  +       unknown_action}
        ,{"a:b(X,y)when not is_atom(X)",
          [{{a,b,2},{['$1',y],[{'not',{is_atom,'$1'}}],[]}}]}
        ,{"a:b(X,y)when not is_atom(X) -> return",
  
positive.code: guard({op,1,Op,One})            -> {Op,guard(One)};           % binary op
  guard(Guard)                    -> arg(Guard).                % variable
  
  arg({cons,_,_,_})   -> exit({syntax_error,no_lists_in_args});
  arg({tuple,1,Args}) -> {tuple,[arg(A)||A<-Args]};
  arg({T,1,Var})      -> {T,Var}.
  
  
negative.code: assert(Fun,Tag) ->
    try Fun()
    catch 
      _:{_,{error,{1,erl_parse,L}}}-> exit({{syntax_error,lists:flatten(L)},Tag});
      _:R                          -> exit({R,Tag})
    end.
  
  
  