[gambit-list] Is there any way to get which procedure a closure comes from?
Marc Feeley
feeley at iro.umontreal.ca
Fri Mar 11 08:03:51 EST 2011
On 2011-03-11, at 7:14 AM, Mikael wrote:
> Dear Marc,
>
> Is there any way to get which procedure a closure comes from? If not, would it be very easy to implement? Just wanted to check.
>
> Kind regards,
> Mikael
It is possible with interpreted code because the "run time environment" (rte) that is stored in the closures has back-pointers to the closure that created it (also known as the "container" procedure). Below is the code, and a demo.
Marc
(define (procedure-creator proc)
(if (##interp-procedure? proc)
(let* (($code (##interp-procedure-code proc))
(rte (##interp-procedure-rte proc)))
(##extract-container $code rte))
#f)) ;; not possible with compiled code, so return #f
(define (make-adder3 x)
(lambda (y)
(lambda (z)
(+ x y z))))
(define f ((make-adder3 11) 22))
(pretty-print (f 33))
(pretty-print (procedure-creator f))
(pp f)
(pp (procedure-creator f))
(pp (procedure-creator (procedure-creator f)))
(pp (procedure-creator (procedure-creator (procedure-creator f))))
(pp (eq? make-adder3 (procedure-creator (procedure-creator f))))
;; prints:
;;
;; 66
;; #<procedure #2>
;; (lambda (z) (+ x y z))
;; (lambda (y) (lambda (z) (+ x y z)))
;; (lambda (x) (lambda (y) (lambda (z) (+ x y z))))
;; #f
;; #t
More information about the Gambit-list
mailing list