unofficial mirror of guile-devel@gnu.org 
 help / color / mirror / Atom feed
* Mutating public bindings of a declarative module
@ 2019-11-24 17:54 Ludovic Courtès
  2019-11-25  6:23 ` Amirouche Boubekki
  2019-11-25  8:33 ` Andy Wingo
  0 siblings, 2 replies; 4+ messages in thread
From: Ludovic Courtès @ 2019-11-24 17:54 UTC (permalink / raw)
  To: Andy Wingo; +Cc: Guile Devel

Hello!

It seems that if you ‘set!’ a public variable of a declarative module,
the change is visible to all the module users, but it’s not necessarily
visible to procedures within that module, presumably because they use an
inlined or specialized variant of that thing.

I would have imagined that public bindings are considered mutable and
thus not subject to inlining; OTOH, that would obviously be a loss, so
the current approach makes sense.

Anyway, it complicates a use case for me.  In Guix, we “mock” bindings
like so:

  (define-syntax-rule (mock (module proc replacement) body ...)
    "Within BODY, replace the definition of PROC from MODULE with the definition
  given by REPLACEMENT."
    (let* ((m (resolve-interface 'module))
           (original (module-ref m 'proc)))
      (dynamic-wind
        (lambda () (module-set! m 'proc replacement))
        (lambda () body ...)
        (lambda () (module-set! m 'proc original)))))

and that allows us to write tests that temporarily modify public (or
private!) bindings.

It seems like this could be addressed by compiling selected modules with
‘user-modules-declarative?’ set to #false, or by avoiding the above hack
altogether when possible, but I thought I’d share my impressions and
listen to what people think.  :-)

Thanks,
Ludo’.



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-11-25 21:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-24 17:54 Mutating public bindings of a declarative module Ludovic Courtès
2019-11-25  6:23 ` Amirouche Boubekki
2019-11-25  8:33 ` Andy Wingo
2019-11-25 21:51   ` Ludovic Courtès

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).