(loop with converged = nil for iteration from 0 to iteration-limit until converged do (setf converged t) (loop for document in documents for old-rank = (rank document) for new-rank = (loop for neighbor in (graph-neighbors document) sum (/ (* damping (rank neighbor) (document-similarity document neighbor)) (graph-neighbor-edge-sum neighbor))) do (setf (rank document) new-rank) unless (convergedp old-rank new-rank) do (setf converged nil) ()))