[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Injecting variables into closures.
From: |
Kjetil S. Matheussen |
Subject: |
Re: Injecting variables into closures. |
Date: |
Thu, 29 Nov 2007 15:44:50 +0100 (CET) |
On Thu, 29 Nov 2007, Kjetil S. Matheussen wrote:
Hi,
I need (well) to inject variables into closures, and have
come up with the following macro to do so:
(define-macro (inject-variable name value)
...
(cond ((null? (cdr ,env))
...
((null? (null? (cdr (car ,env))))
address@hidden&#!
(define-macro (inject-variable name value)
(define env (gensym))
(define closure (gensym))
(define vars (gensym))
(define secondname (gensym))
(define secondval (gensym))
(define first-env (gensym))
`((procedure->macro
(lambda (,(gensym) ,env)
(define ,first-env (car ,env))
(cond ((null? (cdr ,env))
(let ((,closure ,first-env))
(set-car! ,env (cons ',name ,value))
(set-cdr! ,env (list ,closure))))
((not (pair? (cdr ,first-env)))
(let* ((,vars ,first-env)
(,secondname (car ,vars))
(,secondval (cdr ,vars)))
(set-car! ,env
(list (list ',name ,secondname)
,value ,secondval))))
(else
(set-cdr! ,first-env
(cons ,value (cdr ,first-env)))
(set-car! ,first-env
(cons ',name (car ,first-env)))
(set-car! ,env ,first-env)))))))
Sorry. :-)