guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Injecting variables into closures.


From: Kjetil S. Matheussen
Subject: Injecting variables into closures.
Date: Thu, 29 Nov 2007 15:04:12 +0100 (CET)


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)
  (define env (gensym))
  (define closure (gensym))
  (define vars (gensym))
  (define secondname (gensym))
  (define secondval (gensym))
  (define first-env (gensym))
  `((procedure->macro (lambda (,(gensym) ,env)
                        (cond ((null? (cdr ,env))
                               (let ((,closure (car ,env)))
                                 (set-car! ,env (cons ',name ,value))
                                 (set-cdr! ,env (list ,closure))))
                              ((null? (null? (cdr (car ,env))))
                               (let* ((,vars (car ,env))
                                      (,secondname (car vars))
                                      (,secondval (cdr vars)))
                                 (set-car! ,env
                                           (list (list ',name firstname)
                                                 ,value ,secondval))))
                              (else
                               (let ((,first-env (car ,env)))
                                 (set-cdr! ,first-env
                                           (cons ,value (cdr ,first-env)))
                                 (set-car! ,first-env
                                           (cons ',name (car ,first-env)))
                                 (set-car! ,env ,first-env))))))))


(let ()
  (display (defined? 'gakk))
  (inject-variable gakk 90)
  gakk)
=> #f90


Now I wonder, is this safe and portable? Or are there
other and better ways to do this?

Thanks for any answers.

Kjetil.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]