anchor.diff:             | metavar
              | _
              | symbol '?' ;; predicate
  -           | ( -> expr pattern ) ;; view
  -           | ( as pattern metavar ) ;; as
  +           | ( expr -> pattern ) ;; view
  +           | ( pattern :with metavar ) ;; as
              | ( pattern * ) ;; list
              | ( pattern + . pattern ) ;; list+rest
              | ( struct-literal :name pattern :name pattern ) ;; structure literal
  
positive.code:   (cond
      [(list? pattern)
       (cond
         [(eq? (car pattern) 'as)
          (compile-pattern-test (cadr pattern) symb)]
         [(eq? (car pattern) '->)
          (compile-pattern-test (caddr pattern) `(,(cadr pattern) ,symb))]
         [(eq? (car pattern) 'optional)
          `(if ,symb ,(compile-pattern-test (cadr pattern) symb) true)]
         [(struct-pat? pattern)
  
negative.code:     [(! seen) (assert-linearity! pat {})]
      [(list? pat)
       (cond
         [(eq? (cadr pat) ':with)
          (assert-linearity! (caddr pat) seen)]
         [(eq? (cadr pat) '->)
          (assert-linearity! (caddr pat) seen)]
         [(eq? (car pat) 'optional)
          (assert-linearity! (cadr pat) seen)]
  