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
next prev parent 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).