(TRACE *TRACE1 *TRACE2 UNTRACE *UNTRACE)(DEFINEQ TRACE '(NLAMBDA (L) (COND ((EQ L) NIL) (T (MAPCAR L (QUOTE *TRACE1))))))(DEFINEQ *TRACE1 '(LAMBDA (NAME) (COND ((MEMBER NAME *TRACEFNS*) (PRIN1 NAME) (PRIN1 (QUOTE " already traced")) NIL) (T ((LAMBDA (IND FN) (COND ((EQ (CADR IND)) (PRINT (LIST NAME (QUOTE NOT) (QUOTE TRACEABLE))) NIL) (T (DEFINE NAME (LIST (QUOTE MACRO) (QUOTE (*TRACEARG*)) (LIST (QUOTE *TRACE2) (LIST (QUOTE QUOTE) NAME) IND (LIST (QUOTE QUOTE) FN) (QUOTE *TRACEARG*)))) (SETQ *TRACEFNS* (CONS NAME *TRACEFNS*)) NAME))) (LIST (QUOTE QUOTE) (CAR (MEMBER (CAR (GETD NAME)) (QUOTE (LAMBDA NLAMBDA NSUBR SUBR))))) (GETD NAME))))))(DEFINEQ *TRACE2 '(LAMBDA (NAME IND FN ARG1) ((LAMBDA (ARGS) (LIST (QUOTE PROG) (QUOTE (VAL)) (QUOTE (PRIN1 (QUOTE -->))) (LIST (QUOTE PRIN1) (LIST (QUOTE QUOTE) NAME)) (QUOTE (PRIN1 (QUOTE "/ARGS: "))) (LIST (QUOTE PRINT) (LIST (QUOTE QUOTE) (COND ((OR (EQ IND (QUOTE LAMBDA)) (EQ IND (QUOTE SUBR))) (MAPCAR ARGS (QUOTE EVAL))) (T ARGS)))) (LIST (QUOTE SETQ) (QUOTE VAL) (CONS (QUOTE APPLY*) (CONS (LIST (QUOTE QUOTE) FN) ARGS))) (QUOTE (PRIN1 (QUOTE <--))) (LIST (QUOTE PRIN1) (LIST (QUOTE QUOTE) NAME)) (QUOTE (PRIN1 (QUOTE "/VALUE: "))) (QUOTE (PRINT VAL)) (QUOTE (RETURN VAL)))) (COND ((EQ IND (QUOTE LAMBDA)) (CDR ARG1)) ((EQ IND (QUOTE NLAMBDA)) (CDR ARG1)) ((EQ IND (QUOTE SUBR)) (CDR ARG1)) ((EQ IND (QUOTE NSUBR)) (CDR ARG1)) (T ARG1)))))(DEFINEQ UNTRACE '(NLAMBDA (L) (MAPCAR (COND ((EQ L) *TRACEFNS*) (T L)) (QUOTE *UNTRACE))))(DEFINEQ *UNTRACE '(LAMBDA (X) (COND ((MEMBER X *TRACEFNS*) (SETQ *TRACEFNS* (DELETE X *TRACEFNS*)) (DEFINE X (CADR (CADR (CDDR (CAR (CDDR (GETD X))))))) X))))NIL