是否可以在 CL 中跟踪闭包?例如,我可以在下面追踪 foo-3 吗?
(defun foo (n)
(lambda (i) (incf n i)))
FOO
(setf foo-3 (foo 3))
#<CLOSURE :LAMBDA (I) (INCF N I)>
(funcall foo-3 2)
5
(funcall foo-3 2)
7
(trace ???)
请您参考如下方法:
我认为这是不可能的:据我所知,跟踪宏的工作原理通常是将给定符号处的函数替换为调用原始符号并打印出跟踪位的包装器。
如果您对(复杂的)实现细节感兴趣,SBCL 代码位于 src/code/ntrace.lisp (您可能想查看 trace-1 函数)。
当然,如果你只想在调用 foo-3 时打印出一些东西,你总是可以在 foo...