anchor.diff:         (loop for term from 1 upto (min sum max-term)
             nconc (mapcar (lambda (way) (cons term way))
                           (ways-aux (- sum term) (1- len) (1- term)))))))
  -  (mapcar #'nreverse
  -          (ways-aux sum len +max-digit+)))
  +  (loop
  +     with ways = (mapcar #'nreverse (ways-aux sum len +max-digit+))
  +     for cell in other-cells
  +     for mark = (mark cell)
  +     if mark
  +     do (setf ways (delete-if-not (lambda (way) (find mark way)) ways))
  +     finally (return ways)))
   
   (defun make-all-candidates ()
     "list all candidate entries"
  
positive.code: 
  (defconstant +max-digit+ 9)
  
  (defun ways (sum len)
    "calculate the ways to sum up to `sum` using `len` terms"
    (defun ways-aux (sum len max-term)
      (cond
        ((minusp sum) '())
  
negative.code:   (declare (cell c))
    ;; TODO cleanup
    (let ((cand (make-all-candidates)))
      (when (and (horiz c) (horiz (horiz c)))
        (let ((h (horiz (horiz c))) (row (cell-row c)))
          (setf cand (nintersection cand
                                    (reduce #'union
                                            (ways h (length row) row))))))
      (when (and (verti c) (verti (verti c)))
        (let ((v (verti (verti c))) (col (cell-col c)))
          (setf cand (nintersection cand
                                    (reduce #'union
                                            (ways v (length col) col))))))
      (let ((col (cell-col c)))
        (loop for cell in col
           if (mark cell)
  