(in-package :cl-user) (defpackage cl-annot.doc (:nicknames :annot.doc) (:use :cl :annot.util :annot.helper) (:export :doc)) (in-package :annot.doc) (defannotation doc (docstring definition-form) (:arity 2) "Add DOCSTRING documentation for DEFINITION-FORM." (progn-form-replace-last (lambda (definition-form) (case (definition-form-type definition-form) ((defvar defparameter defconstant defun defmethod defmacro deftype define-compiler-macro) (destructuring-bind (def name arg . body) definition-form `(,def ,name ,arg ,docstring ,@body))) ((defstruct) (destructuring-bind (def name-and-options . slots) definition-form `(,def ,name-and-options ,docstring ,@slots))) ((defclass define-condition) (destructuring-bind (def name supers slots . opts) definition-form (pushnew `(:documentation ,docstring) opts :key #'car) `(,def ,name ,supers ,slots ,@opts))) ((defgeneric) (destructuring-bind (def name args . opts) definition-form (pushnew `(:documentation ,docstring) opts :key #'car) `(,def ,name ,args ,@opts))) (t (error "Documentation not supported: ~a" definition-form)))) definition-form)) ;; todo: ;; define-compiler-macro define-condition ;; define-method-combination define-modify-macro ;; define-setf-expander define-symbol-macro