Common lisp 跟踪关闭

Common lisp 跟踪关闭,common-lisp,Common Lisp,是否可以在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 ???) (defun foo(n) (lambda(i)(incf n i))) 福 (setf foo-3(foo-3

是否可以在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 ???)
(defun foo(n)
(lambda(i)(incf n i)))
福
(setf foo-3(foo-3))
#
(funcall foo-3 2)
5.
(funcall foo-3 2)
7.
(痕迹??)

我认为这是不可能的:据我所知,跟踪宏的工作原理通常是将给定符号处的函数替换为一个调用原始函数并打印跟踪位的包装器

如果您对(复杂的)实现细节感兴趣,那么SBCL代码就在(您可能想看看trace-1函数)


当然,如果您只想在调用foo-3时打印出一些内容,那么您可以在foo中的lambda表单中放置一个print语句…

我认为这里的问题是
trace
需要函数名,而不是跟踪闭包的问题。继续上面的示例,您可以从命名函数调用
foo-3
,并跟踪:

(defun call-foo-3 (i)
   (funcall foo-3 i))
(trace call-foo-3)
(call-foo-3 2)
  0: (CALL-FOO-3 2)
  0: CALL-FOO-3 returned 15

这样做确实是可能的。Trace在函数名称空间中查找函数,因此请确保不要混合使用值和函数

(setf (symbol-function 'test)
   (let ((n 0))
    (lambda (x)
     (incf n x))))
=>
#<Interpreted Closure TEST>
(trace test) 
... 
(test 4)
=>
 0[2]: (TEST 4)
 0[2]: returned 4
4
(test 3)
=>
0[2]: (TEST 3)
0[2]: returned 7
7
(setf(符号功能测试)
(let((n0))
(λ(x)
(incf n x)))
=>
#
(微量测试)
... 
(测试4)
=>
0[2]:(测试4)
0[2]:返回4
4.
(测试3)
=>
0[2]:(测试3)
0[2]:返回7
7.

闭包是否有一些基本的东西使得为它们编写跟踪函数变得不可能?谢谢!我已经看过了,还有CLTL。我现在对此有了很好的感觉。关于名称空间这个主题的其他资源是否值得参考?