This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
lutterdc@cs.purdue.edu (David Lutterkort) writes:
> > On Tue Jun 16, Clark McGrew <mcgrew@sukat.icrr.u-tokyo.ac.jp> wrote:
> >
> > I do have a very short wish-list which can be implemented as a very
> > short macro: Add "export-from-module" which takes a list of names and
> > does "(define-public <name> #f)" to export the names, then a regular
> > "define" can be used everyplace else. This makes it really trivial to
> > wrap existing scheme code in a guile module. If the current module
> > system is not DOA, I'll submit an "export-from-module" patch.
<AOL> Yes, please! </AOL>
I really wonder why this hack is not in the Guile README or something.
One small step - and you can write modularized code and not make it
Guile-specific at the same time.
> >
>
> This would be a giant step forward. I tried something similar, but couldn't
> get it to work with define _and_ defmacro. With the present module system,
> I have no idea how I could for example define new syntax with define-syntax
> and export that definition.
Surprisingly, you can, just like with normal definitions:
(define-public my-macro #f)
(defmacro my-macro (arg)
`(car ,arg))
The above just works - `my-macro' is exported. Valid for syncase too.
I don't know, however, if it is wise to depend on this behavior.
OTOH, in whichever way Guile module system may be changed in the
future, it should permit such things somehow, right?
> As I see it, a module system should regulate visibility of names,
> independent of what they're bound to. That's why I don't like the
> distinction between define-public and defmacro-public in the current
> system.
Hmmm. I think *-public stuff is just wrong anyway, as it renders your
code Guile-specific. Also, it is good to have separate export clauses
for regular definitions and syntax - separate compilation (somewhere
in the blue sky) requires this.
Here is what I just started to use for my code:
---------------------->8 cut here 8<----------------------
;;; module-hacks.scm --- export-from-module etc.
;; -*- Scheme -*-
; Copyright (C) 1998 Michael Livshin
(define-module (util module-hacks))
(if (not (defined? 'export-from-module))
(begin
(defmacro-public export-from-module names
`(begin
,@(map (lambda (name)
`(define-public ,name #f))
names)))
;; happens to be the same now:
(defmacro-public export-syntax-from-module names
`(export-from-module ,@names))))
;;; module-hacks.scm ends here
---------------------->8 cut here 8<----------------------
So that you can write:
(define-module (my-module)
#:use-module (util module-hacks))
(export-from-module proc1 var1 var2 proc2 etc)
(export-syntax-from-module macro1 macro2 etc)
Thanks Clark!
>
> Here's my wish-list for a module system:
> (1) Make names available outside of module with an export clause instead of
> different define/defmacro
> (2) Allow selective imports from a module
> (3) Allow renaming of imported names
>
> Maybe all this can be done with the current module system already ... I'm
> not an expert.
(1) See the code above
(2) You can lookup individual symbols in modules, so some magick macro
can probably be written.
(3) Ditto.
> I do like Scheme48's module system (Jonathan Rees: Another
> Module System for Scheme) a lot better than the current one. Has anybody
> ported that to Guile already ?
I guess not. Would be cool - I like it too. In fact, the mailing
list archive seems to suggest that everybody here likes it :)
> David
HTH,
mike.