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

Reply via email to