anchor.diff:    end;
   
   % ## Containers
  -tokenize(Line, [$.,T1,T2|Rest], Tokens) when T1 == $[ andalso T2 == $]; T1 == ${ andalso T2 == $} ->
  -  tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, list_to_atom([T1,T2]), Rest),{'.',Line}|Tokens]);
  -
   tokenize(Line, ".<<>>" ++ Rest, Tokens) ->
     tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, '<<>>', Rest),{'.',Line}|Tokens]);
   
  +tokenize(Line, [$.,T1,T2|Rest], Tokens) when ?container2(T1, T2) ->
  +  tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, list_to_atom([T1,T2]), Rest),{'.',Line}|Tokens]);
  +
   % ## Three Token Operators
  -tokenize(Line, [$.,T1,T2,T3|Rest], Tokens) when
  -  T1 == $=, T2 == $=, T3 == $=;
  -  T1 == $!, T2 == $=, T3 == $= ->
  +tokenize(Line, [$.,T1,T2,T3|Rest], Tokens) when ?comp3(T1, T2, T3) ->
     tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, list_to_atom([T1,T2,T3]), Rest),{'.',Line}|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, [$.,T1,T2|Rest], Tokens) when ?comp2(T1, T2); ?op2(T1, T2) ->
     tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, list_to_atom([T1,T2]), Rest),{'.',Line}|Tokens]);
   
   % ## Single Token Operators
  -tokenize(Line, [$.,T|Rest], Tokens) when T == $+; T == $-; T == $*; T == $&,
  -  T == $/; T == $=; T == $|; T == $!; T == $<; T == $>; T == $^; T == $@ ->
  +tokenize(Line, [$.,T|Rest], Tokens) when ?comp1(T); ?op1(T); T == $& ->
     tokenize(Line, Rest, [tokenize_call_identifier(identifier, Line, list_to_atom([T]), Rest),{'.',Line}|Tokens]);
   
   % Heredocs
   
  -tokenize(Line, [H,H,H|T], Tokens) when H == $"; H == $' ->
  +tokenize(Line, [H,H,H|T], Tokens) when ?is_quote(H) ->
     case extract_heredoc_with_interpolation(Line, true, T, H) of
       { error, _ } = Error ->
         Error;
  
positive.code:   tokenize(Line, Rest, [{list_to_atom([T,T]), Line}|Tokens]);
  
  % ## Comparison three token operators
  tokenize(Line, [T1,T2,T3|Rest], Tokens) when
    T1 == $=, T2 == $=, T3 == $=;
    T1 == $!, T2 == $=, T3 == $= ->
    tokenize(Line, Rest, [{comp_op, Line, list_to_atom([T1,T2,T3])}|Tokens]);
  
  % ## Three token operators - none yet
  
  % ## Comparison two token operators
  tokenize(Line, [T1,T2|Rest], Tokens) when
    T1 == $=, T2 == $=; T1 == $!, T2 == $=;
    T1 == $<, T2 == $=; T1 == $>, T2 == $=;
    T1 == $<, T2 == $- ->
    tokenize(Line, Rest, [{comp_op, Line, list_to_atom([T1,T2])}|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 == $> ->
    tokenize(Line, Rest, [{list_to_atom([T1,T2]), Line}|Tokens]);
  
  % ## Comparison single token operators
  tokenize(Line, [T|Rest], Tokens) when T == $<; T == $> ->
    tokenize(Line, Rest, [{comp_op, Line, list_to_atom([T])}|Tokens]);
  
  % ## Single Token Operators
  
  tokenize(Line, [T|Rest], Tokens) when T == $+; T == $-; T == $*;
    T == $/; T == $=; T == $|; T == $!; T == $^; T == $@ ->
    tokenize(Line, Rest, [{list_to_atom([T]), Line}|Tokens]);
  
  % &
  
  tokenize(Line, [$&,H|Rest], Tokens) when ?is_digit(H) ->
    tokenize(Line, Rest, [{'&', Line, [list_to_integer([H])]}|Tokens]);
  
  % Aliases
  
  
negative.code: -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, []).
  