On 31-Jan-09, at 11:44 PM, lowly coder wrote:
Great, the following works:
cat test.scm (define (foo x) (* x 2))
(define (g x) (foo x))
(pp (g 2)) (pp (let ((old-func '())) (dynamic-wind (lambda () (set! old-func foo) (set! foo (lambda (x) (* x 3)))) (lambda () (g 2)) (lambda () (set! foo old-func)))))
(pp (g 2))
4 6 4
two questions:
- can anything go wrong with variable capture / aliasing?
[intuitively, I believe no, so long as I don't use 'old-func' in my thunk 2) is there a more elegant/idiomatic way to do this?
In terms of elegance I prefer this (which eliminates all variable capture problems):
(let ((thunk (lambda () (g 2))) (new-foo (lambda (x) (* x 3))) (old-foo foo)) (dynamic-wind (lambda () (set! foo new-foo)) thunk (lambda () (set! foo old-foo))))
But once again this will not work right if multiple threads are dynamically scoping foo simultaneously, but the parameterize based approach will work fine.
Marc