(defun explode (object) (loop for char across (prin1-to-string object) collect (intern (string char)))) (defun implode (list) (read-from-string (coerce (mapcar #'character list) 'string))) (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)) )