anchor.diff:  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({cons,_,_,_})   -> exit({syntax_error,no_lists_in_args});
   arg({tuple,1,Args}) -> {tuple,[arg(A)||A<-Args]};
   arg({T,1,Var})      -> {T,Var}.
   
  
positive.code:   try MS=Method(Str),Str
    catch 
      _:{MS,_} -> Str;
      C:R      -> {C,R,Str,erlang:get_stacktrace()}
    end.
  
negative.code: %%   "a:b->stack", "a:b(X)whenX==2->return"
  %% returns
  %%   {atom(M),atom(F),list(Arg)|integer(Arity),list(Guard),list(Action)}
  parse(Str) ->
    {Body,Guard,Action} = assert(split_fun(Str),{split_string,Str}),
    {M,F,A}             = assert(body_fun(Body),{parse_body,Str}),
    Guards              = assert(guards_fun(Guard),{parse_guards,Str}),
    Actions             = assert(actions_fun(Action),{parse_actions,Str}),
    {M,F,A,Guards,Actions}.
  
  %% split the input string in three parts; body, guards, actions
  %% we parse them separately
  split_fun(Str) ->
    fun() ->
        % strip off the actions, if any
  