Elisp, GCL, and SBCL have facilities for tracing calls to functions and printing the calls' arguments. =========================[ Elisp ]========================= In Elisp, you can get debug prints without adding explicit print or format calls to your code. Namely, in lisp-interaction-mode, you can use commands M-x trace-function and M-x untrace-function. The calls to functions you mark so will be printed into a *trace-output* buffer, with their arguments. You can also call these functions programmatically from your code, like (trace-function 'foo) and (untrace-function 'foo), to turn tracing on and off as needed for your debugging. Note that you need a quote or #' here, unlike with GCL and SBCL below. E.g., this traces the first call to copy-list but not the second: (progn (trace-function 'copy-list) (copy-list '(a b c d e) nil) (untrace-function 'copy-list) (copy-list '(1 2 3) nil)) You can also add code to evaluate at the point of the calls, to check not only the arguments but the context at which the function is called. See CONTEXT in the trace-function doc. =========================[ GCL ]========================= >(defun fact (x) (if (eql x 0) 1 (* x (fact (1- x))))) FACT >(trace fact) (FACT) >(fact 5) 1> (FACT 5) 2> (FACT 4) 3> (FACT 3) 4> (FACT 2) 5> (FACT 1) 6> (FACT 0) <6 (FACT 1) <5 (FACT 1) <4 (FACT 2) <3 (FACT 6) <2 (FACT 24) <1 (FACT 120) 120 >(trace 'fact) QUOTE is a special form. NIL =========================[ SBCL ]========================= $ sbcl This is SBCL 1.3.8, an implementation of ANSI Common Lisp. More information about SBCL is available at . CL-USER(4): (defun fact (x) (if (eql x 0) 1 (* x (fact (1- x))))) WARNING: redefining COMMON-LISP-USER::FACT in DEFUN CL-USER(5): (fact 5) 120 // You need to supply the function itself, not the symbol: CL-USER(6): (trace 'fact) WARNING: 'FACT is not a valid function name, not tracing. NIL CL-USER(7): (trace #'fact) WARNING: #'FACT is not a valid function name, not tracing. NIL // Like so: CL-USER(8): (trace fact) (FACT) CL-USER(9): (fact 5) 0: (FACT 5) 1: (FACT 4) 2: (FACT 3) 3: (FACT 2) 4: (FACT 1) 5: (FACT 0) 5: FACT returned 1 4: FACT returned 1 3: FACT returned 2 2: FACT returned 6 1: FACT returned 24 0: FACT returned 120 120 // And untrace: CL-USER(10): (untrace fact) T CL-USER(11): (fact 5) 120 CL-USER(12): ==================================================