On 23-Feb-09, at 3:25 AM, lowly coder wrote:
Urgh ...
(define (setup hook) (let ((settings (##closure-ref hook 1))) (##vector-set! settings 1 #t) (if (##not (##memq proc ##trace-list)) (set! ##trace-list (##cons proc ##trace-list)))))
does ##closure-ref do what I think it does? (break the closure abstraction ... and is the "1" like saying "the first var [which just so happens to be settings]")
No time to go into the details right now, but yes the compiled closures use a flat representation (a structure with a "code" pointer followed by the free non-global variables of the lambda).
this seems awfully hairy + brittle
Depends. The free variables are sorted (based on their name), so it is possible by a code analysis (and a careful writing of the lambda) to figure out which one is referenced. So it is somewhat brittle for "general use", but for implementing the evaluator itself it is an appropriate abstraction. The evaluator's code would of course gain in clarity if these constants were symbolic... and that should be fixed.
Marc