I'd also like to propose the following addition: (defun sometimes (test then &optional (else nil else-p)) "Returns a function that applies TEST on its arguments and returns either THEN or ELSE depending on the test result. If ELSE is not provided, the arguments passed to the returned function are returned as multiple values. Examples: (mapcar (sometimes #'plusp 1 -1) '(1 -1 2 -2 3 -3)) ==> (1 -1 1 -1 1 -1) (mapcar (sometimes #'minusp 0) '(1 -1 2 -2 3 -3)) ==> (1 0 2 0 3 0) " (flet ((%sometimes (&rest args) (if (apply test args) then (if else-p else (values-list args))))) #'%sometimes)) It's in the same spirit as CONSTANTLY, which is also the reason for its name. (SOMETIMES #'PLUSP 1 -1) can be read as sometimes 1, sometimes -1, depending on PLUSP. The internal FLET should probably be replaced by a call to ALEXANDRIA:NAMED-LET. -T.