anchor.diff:          || A <- Args]
       , ", ")
       ++ ")";
  +
  +% lists
   fold({'list', Elms}) ->
       "(" ++
       string:join(
  
positive.code:         || F <- Forms]
      , ", ")
      ++ " ";
  
  fold({'between', A, B, C}) ->
      A1 = if is_binary(A) -> binary_to_list(A); true -> fold(A) end,
      B1 = if is_binary(B) -> binary_to_list(B); true -> fold(B) end,
      C1 = if is_binary(C) -> binary_to_list(C); true -> fold(C) end,
      lists:flatten([A1,  " between ", B1, " and ", C1]);
  
  fold({Op, A}) when Op =:= '-'; Op =:= 'not' ->
      case A of
          A when is_binary(A) -> lists:flatten([atom_to_list(Op), " (", binary_to_list(A), ")"]);
          A                   -> lists:flatten([atom_to_list(Op)," (", fold(A), ")"])
      end;
  
  fold({'||', Args}) ->
      string:join(
      [case A of
  
negative.code:     end
      || A <- Args], " || ");
  
  % All aliases
  fold({as, A, B}) when is_binary(A), is_binary(B) -> lists:flatten([binary_to_list(A), " ", binary_to_list(B)]);
  fold({as, A, B}) when is_binary(B)               -> lists:flatten([fold(A), " ", binary_to_list(B)]);
  fold({as, A}) when is_binary(A)                  -> lists:flatten(["as ", binary_to_list(A)]);
  
  % Union
  fold({union, A, B})                              -> lists:flatten(["(", fold(A), " union ", fold(B), ")"]);
  
  % All where clauses
  fold({where, []}) -> "";
  fold({where, Where}) -> "where " ++ fold(Where);
  
  % In operator
  % for right hand non list argument extra parenthesis added
  fold({'in', L, {'list', _} = R}) when is_binary(L) ->
      lists:flatten([binary_to_list(L), " in ", fold(R), " "]);
  fold({'in', L, R}) when is_binary(L), is_tuple(R) ->
      lists:flatten([binary_to_list(L), " in (", fold(R), ") "]);
  
  % Boolean and arithmetic binary operators handled with precedence
  % *,/ > +,- > and > or
  fold({Op, L, R}) when is_atom(Op), is_tuple(L), is_tuple(R) ->
      Fl = case {Op, element(1, L)} of
          {'*', Ol} when Ol =:= '-'; Ol =:= '+' -> lists:flatten(["(", fold(L), ")"]);
  