anchor.diff:    lists:foldr(
       fun(Str,O)->[unit(fun transform/1,Str)|O]end,[],
       [{"a",
  -      {{a,'_','_'},{[],[],[]}}}
  +      [{{a,'_','_'},{[],[],[]}}]}
        ,{"a->stack",
  -       {{a,'_','_'},{[],[],[{message,{process_dump}}]}}}
  +       [{{a,'_','_'},{[],[],[{message,{process_dump}}]}}]}
        ,{"a:b",
  -       {{a,b,'_'},{[],[],[]}}}
  +       [{{a,b,'_'},{[],[],[]}}]}
        ,{"a:b->return",
  -       {{a,b,'_'},{[],[],[{return_trace}]}}}
  +       [{{a,b,'_'},{[],[],[{return_trace}]}}]}
        ,{"a:b/2",
  -       {{a,b,2},{[],[],[]}}}
  +       [{{a,b,2},{[],[],[]}}]}
        ,{"a:b/2->return",
  -       {{a,b,2},{[],[],[{return_trace}]}}}
  +       [{{a,b,2},{[],[],[{return_trace}]}}]}
        ,{"a:b(X,Y)",
  -       {{a,b,2},{['$1','$2'],[],[]}}}
  +       [{{a,b,2},{['$1','$2'],[],[]}}]}
        ,{"a:b(X,X)",
  -       {{a,b,2},{['$1','$1'],[],[]}}}
  +       [{{a,b,2},{['$1','$1'],[],[]}}]}
        ,{"a:b(X,X) -> return;stack",
  -       {{a,b,2},{['$1','$1'],[],[{return_trace},{message,{process_dump}}]}}}
  +       [{{a,b,2},{['$1','$1'],[],[{return_trace},{message,{process_dump}}]}}]}
        ,{"a:b(X,y)",
  -       {{a,b,2},{['$1',y],[],[]}}}
  +       [{{a,b,2},{['$1',y],[],[]}}]}
        ,{"a:b(X,1)",
  -       {{a,b,2},{['$1',1],[],[]}}}
  +       [{{a,b,2},{['$1',1],[],[]}}]}
        ,{"a:b(X,\"foo\")",
  -       {{a,b,2},{['$1',"foo"],[],[]}}}
  +       [{{a,b,2},{['$1',"foo"],[],[]}}]}
        ,{"a:b(X,y)when is_atom(Y)",
          unbound_variable}
  +     ,{"x:c([string])",
  +       {syntax_error,no_lists_in_args}}
  +     ,{"x(s)",
  +       this_is_too_confusing}
        ,{"a:b(X,y)when not is_atom(X)",
  -       {{a,b,2},{['$1',y],[{'not',{is_atom,'$1'}}],[]}}}
  +       [{{a,b,2},{['$1',y],[{'not',{is_atom,'$1'}}],[]}}]}
        ,{"a:b(X,y)when not is_atom(X) -> return",
  -       {{a,b,2},{['$1',y],[{'not',{is_atom,'$1'}}],[{return_trace}]}}}
  +       [{{a,b,2},{['$1',y],[{'not',{is_atom,'$1'}}],[{return_trace}]}}]}
        ,{"a:b(X,y)when element(1,X)==foo, (X==z)",
  -       {{a,b,2},{['$1',y],[{'==',{element,1,'$1'},foo},{'==','$1',z}],[]}}}
  -     ,{"a:b(X,Y)when X==1,Y=/=a",
  -       {{a,b,2},{['$1','$2'],[{'==','$1',1},{'=/=','$2',a}],[]}}}
  +       [{{a,b,2},{['$1',y],[{'==',{element,1,'$1'},foo},{'==','$1',z}],[]}}]}
  +    ,{"a:b(X,Y)when X==1,Y=/=a",
  +       [{{a,b,2},{['$1','$2'],[{'==','$1',1},{'=/=','$2',a}],[]}}]}
       ]).
   
   
  
positive.code: guard({op,1,Op,One})            -> {Op,guard(One)};           % binary op
  guard(Guard)                    -> arg(Guard).                % variable
  
  arg({cons,_,_,_})   -> throw({badmatch,{syntax_error,no_lists_in_args}});
  arg({tuple,1,Args}) -> {tuple,[arg(A)||A<-Args]};
  arg({T,1,Var})      -> {T,Var}.
  
  
negative.code:         {ok,[{call,1,{remote,1,{atom,1,M},{atom,1,F}},Args}]} ->
            {M,F,[arg(A) || A<-Args]};
          {ok,[{remote,1,{atom,1,M},{atom,1,F}}]} ->
            {M,F,'_'};
          {ok,_} ->
            exit(this_is_too_confusing)
       end
    end.
  
  guards_fun(Str) -> 
  