anchor.diff:                     (union (row-defined-spots array spot binds)
                             (col-defined-spots array spot binds)
                             (sqr-defined-spots array spot binds)))))))))
  +
  +(defun apply-bindings (binds array)
  +  "Apply the given bindings to ARRAY."
  +  (setf array (copy-seq array))
  +  (loop for ((row . col) . n) in binds
  +    do (setf (aref array row col) n))
  +  array)
   
   (defun next-undefined-spot (array &optional defined-spots (start (cons 0 0)))
     "Return the next spot of ARRAY, read from left to right and from top to bottom, that comes after START and is NIL."
  
positive.code:                 ;; if every cell is compatible with the current state of columns
                  (when (every #'identity (mapcar #'car p))
                    (solve-nonogram (butlast rows)
                                    (mapcar #'cadr p)
                                    (cons row puzzle))))
                (generate-rows (car (last rows))))))
  
  ;; A column is represented as a list of numbers with last element possibly NIL, depending on if the last row can be filled.
  
  
negative.code:   "Separate COLS into firsts and rests based on whether row is T at each column."
    (loop for cell in row
          for col in cols
      if cell 
        collect (cons (column-first col) (column-rest col))
      else
        collect (cons T col)))
  
  (defun column-first (col)
    "Return T if a cell in the last row and same column as COL can be filled."
  