Plaster

text
(defmacro log-defun (name parameters &body body) "Transforms supplied source code into an equivalent function that logs its arguments and results into global variable *flat-list*." `(defun ,name ,parameters (progn (incf *counter*) (let ((*levels* (let ((x (my-copy *levels*))) (vector-push-extend *counter* x) x)) (*counter* 0)) (let ((result (funcall (lambda (*counter* *levels* ,@parameters) ,@body) *counter* *levels* ,@parameters))) ;; Data saved is (logging-level . (fn-name fn-param fn-body fn-args fn-result)) ;; We use list here and not a struct as we transfer this data to Emacs (push (cons (vector-to-list *levels*) (list ',name ',parameters ',body (mapcar (lambda (a) (format nil "~s" a)) (list ,@parameters)) (format nil "~s" result))) *flat-list*) result)))))