[Top][All Lists]

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


From: Maciek Godek
Subject: Closure?
Date: Fri, 11 Jul 2008 16:48:06 +0200

Hi folks,

I've been wondering if there's any way to recall
(or get inside) an environment of a closure (= to
directly access variables bound to a closure)

And here's what I mean exactly:

(define ++ (let ((c 0)) (lambda()(set! c (1+ c))c)))
; we now have a closure
(procedure-environment ++)
;-> ((c . 0) #<eval-closure 7f6d672efa80>)
;-> 1
; Now I would like to be able to do the following:
(with (procedure-environment ++) (set! c 20))
; the c variable in closure ++ is set to 20
(define -- (with (procedure-environment ++)
        (lambda()(set! c (1- c)) c)))

; here we have a new function bound to the same closure
;-> 19

Is there any way to achieve this in guile?
(it is especially important for me to make it
efficiently doable from C). I've tried some
funny combinations of eval and procedure-environment,
but they didn't work out.

Additionaly, it would be nice to see the possibility
of explicit definitions of environments, like:

(define env (make-closure (a . 1)(b . 2))
(with env (define c 3))

so that we could define the aforementioned
counter as:
(define counter-env (make-closure (c . 0)))
(define ++ (with counter-env (lambda()(set! c (1+ c))c)))
and so forth.

By the way, the let special form could then be
defined using this make-environment function
(define-macro (let bindings body)
  (with (make-closure* bindings) body))

(I've suffixed the name with asterisk as some
transformations between the let bindings and
make-closure bindings are required to make it
work properly)

Hope I'm not reinventing the wheel here; it
would be nice to be able to use guile in such
way, though (and to make sure that it is
efficient from the C level as well). It
would also make scheme oop more intuitive,
as method names could be hidden inside a closure
and so it would allow the following syntax:

(with object (method args))

which corresponds to the famous dot syntax
known from many oo-languages like c++ or python:


Would it be difficult to implement such
functionality in guile? (if there's none implemented yet
-- I didn't find anything in the documentation)

(thanks in advance for implementation :)
Maciek Godek

reply via email to

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