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))))
[EMAIL PROTECTED]&#!
(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. :-)
_______________________________________________
Guile-user mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/guile-user