追踪关闭
是否有可能追踪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 ???)
确实有可能这样做。 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
我不认为这是可能的:据我所知,跟踪宏一般是通过用一个调用原件的包装来代替给定符号的函数,并打印出跟踪位。
如果您对(复杂的)实现细节感兴趣,那么SBCL代码位于src / code / ntrace.lisp中(您可能需要查看trace-1函数)。
当然,如果你所要做的只是在foo-3被调用时打印出来,你总是可以在foo中的lambda表单中放置打印语句......
我认为这里的问题是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
链接地址: http://www.djcxy.com/p/53897.html
上一篇: Tracing a closure