(defun string-to-list (str) (loop for char across str collect char)) (defun ordered-word-p (str) (if (= 0 (length str)) nil (apply #'CHAR-NOT-GREATERP (string-to-list str)))) (defun words () (with-open-file (in "/usr/share/dict/words") (loop for line = (read-line in nil) while line collect line))) (defun ordered-words (words) (remove-if-not #'ordered-word-p words)) (defun longest-ordered-words (words) (let ((ow (ordered-words words)) (longest (list)) (longest-length 0)) (loop for w in ow for cur-length = (length w) ;;add to list of longest words when (= cur-length longest-length) do (setf longest (cons w longest)) ;;replace list of longest words when (> cur-length longest-length) do (progn (setf longest-length cur-length) (setf longest (list w))) finally (return (reverse longest)))))