(These were far more usefull in the pre-slime days.)
(defmacro ppm1 (form) "(pprint (macroexpand-1 ',form)). NB: C-RET is even shorter." `(pprint (macroexpand-1 ',form)))
(defmacro ppm (form) `(pprint (macroexpand ',form)))
A portable flexable APROPOS implementation
(defun apropos-list* (string &key (fbound nil fbound-supplied-p) (bound nil bound-supplied-p) (package nil package-supplied-p) (distance 0 distance-supplied-p)) (let ((symbols '())) (do-all-symbols (sym) (block collect-symbol (when fbound-supplied-p (when (xor fbound (fboundp sym)) (return-from collect-symbol))) (when bound-supplied-p (when (xor bound (boundp sym)) (return-from collect-symbol))) (when package-supplied-p (unless (eql package (symbol-package sym)) (return-from collect-symbol))) (when distance-supplied-p (unless (and (<= (abs (- (length (symbol-name sym)) (length string))) distance) (<= (levenshtein-distance string (symbol-name sym)) distance)) (return-from collect-symbol))) (when (not distance-supplied-p) ;; regular string= test (unless (search string (symbol-name sym) :test #'char-equal) (return-from collect-symbol))) ;; all the checks we wanted to perform passed. (push sym symbols))) symbols))
(defun apropos* (&rest apropos-args) (flet ((princ-length (sym) (if (keywordp sym) (+ 1 (length (symbol-name sym))) (+ (length (package-name (symbol-package sym))) 1 (length (symbol-name sym)))))) (let* ((syms (apply #'apropos-list* apropos-args)) (longest (apply #'max (mapcar #'princ-length syms)))) (dolist (sym syms) (if (keywordp sym) (progn (princ ":" *debug-io*) (princ (symbol-name sym) *debug-io*)) (progn (princ (package-name (symbol-package sym)) *debug-io*) (princ ":" *debug-io*) (princ (symbol-name sym) *debug-io*))) (princ (make-string (- longest (princ-length sym)) :initial-element #\Space) *debug-io*) (when (fboundp sym) (princ " [FUNC] " *debug-io*)) (when (boundp sym) (princ " [VAR] " *debug-io*)) (terpri *debug-io*)))) (values))