unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Peter Brett <peter@peter-b.co.uk>
To: guile-user@gnu.org
Subject: Re: Multiple parallel environments
Date: Thu, 30 Jul 2009 16:19:36 +0100	[thread overview]
Message-ID: <we1mbpn2dwqf.fsf@ssclt003.ee.surrey.ac.uk> (raw)
In-Reply-To: 878wi6jklf.fsf@gnu.org

ludo@gnu.org (Ludovic Courtès) writes:

> Hello!
>
> Peter Brett <peter@peter-b.co.uk> writes:
>
>> ludo@gnu.org (Ludovic Courtès) writes:
>
> [...]
>
>>> What do you mean by "environment"?  All the global variables associated
>>> with a given file in the editor?
>>
>> Sort of.  The whole of Guile's top level bindings at that point.  (The
>> per-directory config is literally loaded as a Scheme script, so it
>> could define and redefine functions and variables at will).
>
> Then you are looking for Guile's nifty first-class modules.  The module
> API is unfortunately lightly documented (info "(guile) Module System
> Reflection").

Indeed.  Should I file a feature request for "more useful
documentation of the Guile module system"?  IMHO, examples like
my use case would be very useful and informative.

How much will the way they work be changing in the next stable series
of Guile releases?  How will they work w.r.t. R6RS modules?

>>> What do you mean by "save"?  Serialize to a file the "environment"
>>> associated with a file (or the difference compared to the initial
>>> environment)?
>>
>> It doesn't need to be serialised -- I don't even need to be able to
>> get a C pointer to it! -- it just needs to be "stashed" somewhere so
>> that I can "rewind" Guile's toplevel bindings to that point at a later
>> time.
>>
>> Essentially, I want each directory/"project" to be able to define its
>> own functions, include its own modules etc. without stomping over
>> another project that happens to be loaded into the application at the
>> same time.
>
> Easy!  :-)
>
> What you would do is create one module for each file/project/directory:
>
>   (define (make-per-file-module name)
>     (let ((m (make-module)))
>       (set-module-name! m name) ;; give the module an optional name
>       (beautify-user-module! m) ;; populate the module with the
>                                 ;; default bindings
>       m))

Something like the following?

  SCM
  create_module_for_dir (char *c_path) /* Path is a UTF-8 string */
  {
    SCM magic = scm_from_locale_symbol ("*magic-dir-module*");
    SCM path  = scm_from_locale_symbol (c_path);
    SCM module = scm_resolve_module (scm_list_2 (magic, path));
    scm_remember_upto_here_2 (magic, path);
    return module;
  }

Not entirely sure how to emulate "beautify-user-module!" in C... any ideas?

> Then you create one such module for each file/directory/etc. and somehow
> associate it with said file/directory/etc. (with an alist, a hash table,
> or something similar).  When entering a file associated with that
> module, you just have to make it current:
>
>   (define (enter-file-buffer file)
>     (set-current-module! (lookup-per-file-module file)))
>
> And voilà!  :-)
>
> Hope this helps,

This does help, thanks!

                               Peter :-)

-- 
Peter Brett <peter@peter-b.co.uk>
Remote Sensing Research Group
Surrey Space Centre





  reply	other threads:[~2009-07-30 15:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-29 17:34 Multiple parallel environments Peter Brett
2009-07-30 13:14 ` Ludovic Courtès
2009-07-30 14:12   ` Peter Brett
2009-07-30 14:45     ` Ludovic Courtès
2009-07-30 15:19       ` Peter Brett [this message]
2009-07-30 15:45         ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=we1mbpn2dwqf.fsf@ssclt003.ee.surrey.ac.uk \
    --to=peter@peter-b.co.uk \
    --cc=guile-user@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).