(defun schwartz (list comp-fn val-fn) "Perform a Schwartzian transform on LIST with comparison function COMP-FUN and value-generating function VAL-FUN." (mapcar #'car (sort (mapcar `(lambda (item) (cons item (funcall ',val-fn item))) list) `(lambda (a b) (funcall ',comp-fn (cdr a) (cdr b)))))) (defun schwartz-test () (schwartz '("adjn:Joshua Ng" "adktk:KaLap Timothy Kwong" "admg:Mahalingam Gobieramanan" "admln:Martha L. Nangalama") 'string< (lambda (item) (if (string-match " \\(\\w+\\)$" item) (match-string 1 item) ""))))