跟踪关闭

use*_*081 7 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 ???)
Run Code Online (Sandbox Code Playgroud)

小智 1

确实可以这样做。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
Run Code Online (Sandbox Code Playgroud)