(defun concat-symbols (sym1 sym2) (intern (concatenate 'string (string sym1) (string sym2))) ) (defmacro defun.fexpr (funname varlist &rest expr) (let ((ffunname (concat-symbols funname '.fexpr))) `(progn (defun ,ffunname ,varlist ,@expr) (defmacro ,funname (&body args) (list ',ffunname (list 'quote args))) ) ) ) (defun fexprlist (el) (if (null el) nil (cons (concat-symbols (car el) '.fexpr) (fexprlist (cdr el))) ) ) ;; use trace.fexpr(untrace.fexpr) instead of trace(untrace) ;; for functions defined with defun.fexpr (defmacro trace.fexpr (&body funname) (cons 'trace (fexprlist funname)) ) (defmacro untrace.fexpr (&body funname) (cons 'untrace (fexprlist funname)) )