(defun equal-frequency-discretization (data n &optional (cautions (make-caution))) (let* ((numbers (sane-numbers data cautions)) (want (round (/ (length numbers) n))) (break-at (breaks numbers want)) (new (mapcar #'(lambda(datum) (efd1 datum break-at)) data))) new)) (defun efd1 (x break-at) (if (unknownp x) x (dolist (b break-at b) (if (<= x b ) (return-from efd1 b))))) (defun breaks (l max-size) (let (out) (reverse (breaks1 (first l) (rest l) nil out 1 max-size)))) (defun breaks1 (x l b4 out n max-size) (unless (eql x b4) (when (>= n max-size) (setf n 0) (push x out))) (cond (l (breaks1 (first l) (rest l) x out (1+ n) max-size)) (t (pushnew x out) out)))