anchor.diff:  -define(is_upcase(S), S >= $A andalso S =< $Z).
   -define(is_downcase(S), S >= $a andalso S =< $z).
   -define(is_word(S), ?is_digit(S) orelse ?is_upcase(S) orelse ?is_downcase(S)).
  +-define(is_quote(S), S == $" orelse S == $').
  +
  +-define(container2(T1, T2),
  +  T1 == ${, T2 == $};
  +  T1 == $[, T2 == $]
  +).
  +
  +-define(comp3(T1, T2, T3),
  +  T1 == $=, T2 == $=, T3 == $=;
  +  T1 == $!, T2 == $=, T3 == $=
  +).
  +
  +-define(comp2(T1, T2),
  +  T1 == $=, T2 == $=;
  +  T1 == $!, T2 == $=;
  +  T1 == $<, T2 == $=;
  +  T1 == $>, T2 == $=
  +).
  +
  +-define(op2(T1, T2),
  +  T1 == $&, T2 == $&;
  +  T1 == $|, T2 == $|;
  +  T1 == $<, T2 == $>;
  +  T1 == $+, T2 == $+;
  +  T1 == $-, T2 == $-;
  +  T1 == $*, T2 == $*;
  +  T1 == $/, T2 == $/;
  +  T1 == $:, T2 == $:;
  +  T1 == $<, T2 == $-;
  +  T1 == $-, T2 == $>
  +).
  +
  +-define(comp1(T),
  +  T == $<;
  +  T == $>
  +).
  +
  +-define(op1(T),
  +  T == $+;
  +  T == $-;
  +  T == $*;
  +  T == $/;
  +  T == $=;
  +  T == $|;
  +  T == $!;
  +  T == $^;
  +  T == $@
  +).
   
   tokenize(String, Line) ->
     tokenize(Line, String, []).
  
positive.code: % Atom operators
  
  % ## Containers
  tokenize(Line, [$:,T1,T2|Rest], Tokens) when T1 == $[ andalso T2 == $]; T1 == ${ andalso T2 == $} ->
    tokenize(Line, Rest, [{atom,Line,[list_to_atom([T1,T2])]}|Tokens]);
  
  tokenize(Line, ":<<>>" ++ Rest, Tokens) ->
    tokenize(Line, Rest, [{atom,Line,['<<>>']}|Tokens]);
  
  % ## Three Token Operators
  tokenize(Line, [$:,T1,T2,T3|Rest], Tokens) when
    T1 == $=, T2 == $=, T3 == $=;
    T1 == $!, T2 == $=, T3 == $= ->
    tokenize(Line, Rest, [{atom,Line,[list_to_atom([T1,T2,T3])]}|Tokens]);
  
  % ## Two Token Operators
  tokenize(Line, [$:,T1,T2|Rest], Tokens) when T1 == $& andalso T2 == $&;
    T1 == $|, T2 == $|; T1 == $<, T2 == $>;
    T1 == $=, T2 == $=; T1 == $!, T2 == $=;
    T1 == $<, T2 == $=; T1 == $>, T2 == $=;
    T1 == $+, T2 == $+; T1 == $-, T2 == $-;
    T1 == $*, T2 == $*; T1 == $/, T2 == $/;
    T1 == $<, T2 == $-; T1 == $:, T2 == $:;
    T1 == $-, T2 == $> ->
    tokenize(Line, Rest, [{atom,Line,[list_to_atom([T1,T2])]}|Tokens]);
  
  % ## Single Token Operators
  tokenize(Line, [$:,T|Rest], Tokens) when T == $+; T == $-; T == $*; T == $&;
    T == $/; T == $=; T == $|; T == $!; T == $<; T == $>; T == $^; T == $@; T == $. ->
    tokenize(Line, Rest, [{atom,Line,[list_to_atom([T])]}|Tokens]);
  
  % Ambiguous unary/binary operators tokens
  
negative.code:   { Rest, Atom } = tokenize_atom([T|String], []),
    tokenize(Line, Rest, [{atom,Line,[Atom]}|Tokens]);
  
  tokenize(Line, [$:,H|T], Tokens) when ?is_quote(H) ->
    case elixir_interpolation:extract(Line, true, T, H) of
      { NewLine, Parts, Rest } -> tokenize(NewLine, Rest, [{atom,Line,unescape_tokens(Parts)}|Tokens]);
      Else -> Else
  