anchor.diff:          (get-square board initial-file initial-rank)
           nil))
   
  -(defun make-move (move board whitep)
  -  "Destructively modifies the board for the given move. The move parameter
  -   should be a string in algebraic chess notation. PRECONDITION: The move is
  -   valid on the given board."
  -  (destructuring-bind (piece origin-rank origin-file capturep
  +(defun castling-move-p (move)
  +  "Determines if a action in algebraic chess notation represents a castle
  +   or a simple, single piece move."
  +  (char= (char move 0) #\0))
  +
  +(defun queenside-castle (board whitep)
  +  "Destructively modifies the board to apply a queenside castle. The whitep
  +   parameter indicates which player is performing the move."
  +  (let ((rank (if whitep 7 0))
  +        (initial-king-file 4) (initial-rook-file 0)
  +        (final-king-file 2) (final-rook-file 3))
  +    (move-from-to board initial-king-file rank final-king-file rank)
  +    (move-from-to board initial-rook-file rank final-rook-file rank)))
  +
  +(defun kingside-castle (board whitep)
  +  "Destructively modifies the board to apply a kingside castle. The whitep
  +   parameter indicates which player is performing the move."
  +  (let ((rank (if whitep 7 0))
  +        (initial-king-file 4) (initial-rook-file 7)
  +        (final-king-file 6) (final-rook-file 5))
  +    (move-from-to board initial-king-file rank final-king-file rank)
  +    (move-from-to board initial-rook-file rank final-rook-file rank)))
  +
  +(defun make-castle-move (move board whitep)
  +  "Simultaneously moves the king and a rook, switching their sides. The
  +   move parameter must represent a castle (0-0, 0-0-0, 0-0+, etc)."
  +  (register-groups-bind (queensidep check)
  +      (+algebraic-castle-re+ move)
  +    (declare (ignore check))
  +    (if queensidep
  +        (queenside-castle board whitep)
  +        (kingside-castle board whitep)))
  +  board)
  +
  +(defun make-one-piece-move (move board whitep)
  +  "Destructively shifts one piece on a board. The move parameter must
  +   represent the movement of a single piece (e.g. e4, Qxd5)."
  +  (destructuring-bind (piece origin-file origin-rank capturep
                                final-file final-rank promotion check)
         (destructure-move move)
       (declare (ignore check))
  
positive.code:              (and (string= check-sign "#")
                    (checkmate-p future-board (not whitep)))))))
  
  (defun valid-move-p (move board whitep)
    "Determines if a move can be performed on a given board."
    (when (destructure-move move)
      (destructuring-bind (piece origin-rank origin-file capturep
                                 final-file final-rank promotion check)
          (destructure-move move)
        (let ((origin (move-origin final-file final-rank board piece
  
negative.code:                     :new-piece (when promotion
                                   (piece-char->symbol promotion whitep)))))
    board)
  
  (defun make-move (move board whitep)
    "Destructively modifies the board for the given move. The move parameter
     should be a string in algebraic chess notation. PRECONDITION: The move is
     valid on the given board."
    (if (castling-move-p move)
        (make-castle-move move board whitep)
        (make-one-piece--move move board whitep)))
  