anchor.diff:  (def reverse (list)
      (reverse' list Empty))
   
  -(def concat (first second)
  +(def concat' (first second)
       (match first
           Empty second
  -        (Cons char rest) (concat rest (Cons char second))))
  +        (Cons char rest) (concat' rest (Cons char second))))
  +
  +(def concat (first second)
  +    (concat' (reverse first) second))
   
   (def consuming-reduce (source collector reducer)
       (match source
  
positive.code:            Empty (Pair Empty tokens))))))))
  
  (def tokenize (source)
      (second (consuming-reduce source Empty tokenize-next)))
  
  (data (ast name value) (Expression (list (ast name value)))
                         (Symbol name)
  
negative.code: (def parse (tokens)
      (second (parsing-reduce tokens Empty parse-next)))
  
  (def stringify-list-insert-space (asts string stringify)
      (match asts
             Empty string
             (Cons expression rest) (stringify-list-insert-space rest (stringify expression (Cons 32 string)) stringify)))
  
  (def stringify-list (asts string stringify)
      (match asts
             Empty string
             (Cons expression rest) (stringify-list-insert-space rest (stringify expression string) stringify)))
  
  (def stringify' (ast string)
      (match ast
          (Expression asts) (Cons 40 (stringify-list (reverse asts) (Cons 41 string) stringify'))
          (Symbol name) (concat name string)
          (Int32 name) (concat name string)
          ParseError (Cons 63 string)))
  
  (def stringify (asts)
      (stringify-list asts Empty stringify'))
  
  (export main (source)
          (stringify (parse (tokenize source))))
  