[R6RS] Modules
Manuel Serrano
Manuel.Serrano
Thu Nov 4 10:38:54 EST 2004
On Wed, 3 Nov 2004 05:56:36 -0700
Matthew Flatt <mflatt at cs.utah.edu> wrote:
> At Wed, 3 Nov 2004 06:55:19 +0100, Manuel Serrano wrote:
> > 1- get rid of the language parameter.
> >
> > I really don't see the necessity of the language specification. As far
> > as I understand, with the language argument, one should write:
> >
> > (module foo r6rs ...foobar...)
> >
> > without it, he should write:
> >
> > (module foo (require r6rs) ..foobar...)
> >
> > Is it really for saving 10 characters that we are introducing this
> > irregularity?
>
> No, but that's not what it's for. The reason to have a language
> position is to have a place that binds `require', and to thus support
> languages that do not provide `require'.
There is something that I still don't understand. You suppose that
your interpreter/compiler knows enough about modules so that it knows
that a module is a list whose third element is a symbol representing a
module identifier that is actually required. You not going a step
further and state that your interpreter/compiler knows about r6rs modules!
I'm probably missing something here...
> > 2- I really don't like the closing of the MODULE form. I don't like to
> > put the definition inside the definition of the module. I would really
> > push in favor of a form where the module only contains the require and
> > provide forms, the definitions being written elsewhere.
>
> I prefer putting the module all in one set of parens, because it
> integrates in an obvious way with a REPL and with a stream
> representation of modules.
>
> > iii- The solution B enables splitting a module across several files.
>
> As long as we have an `include' form, a module implementation can be in
> multiple files, anyway.
>
> > If you want a more "general" example, imagine a very old but very interesting
> > Scheme source file "interesting.scm" implemented in Scheme R4Rs. Imagine now
> > that with your favorite R6RS implementation you provide a backward
> > compatibility kit. Then, with solution B you could have two files:
> >
> > -----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
> > file1.scm:
> > (module very-interesting-r4rs-implementation (require r4rs)
> > (provide ...))
> >
> > interesting.scm:
> > <your very interesting r4rs code>
>
> Or, if you have `include':
>
> (module very-interesting-r4rs-implementation r4rs+provide+include
> (provide ...)
> (include "interesting.scm"))
>
> interesting.scm:
> <your very interesting r4rs code>
This is a solution, I agree. It is more or less equivalent to the Mike's
(CODE ...) form. I don't like it very much it supposes that two files
are required for every modules. Unless one is allowed to right:
foo.scm:
-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
(module a-module
(provide foo)
(define-macro (module . -) #f)
(include "foo.scm"))
(define (foo x)
x)
-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----
Would this be correct? (provided that we allow non-r5rs macros, of course).
I'm just kidding, this is rather ugly.
I don't like very much the INCLUDE of CODE solution because it forces you
to right in FILENAME in your code. As I have said, I think that we should
avoid that.
> > 3- I definitively think that we should not permit module definitions to
> > contain module/file association. [...]
> > In conclusion, the association module/file should NOT be specified in
> > the language. It's up to the implementation to provide a mechanism for
> > deciding the association. For a clause such as (require FOO) an implementation
> > could decide that the module is located in the file FOO.scm, FOO.your-prefix,
> > your-directory/FOO.your-prefix, ... It has nothing to do with the definition
> > of the language itself.
>
> This is fine with me, as long as a side name->file is *not* part of the
> standard. Meanwhile, I suggest that we name modules with strings rather
> than symbols.
I agree, name->file should not be in the standard. Hence I think that we can
even keep symbols.
> (This is what I proposed in my revised strawman in September. When
> libraries are distributed, we need to commit to a stream/file
> representation of modules, but that's a distinct issue from the
> mechanism for finding installed modules.)
>
> > 4- change the semantics of the evaluation of the top level forms.
> > [...]
> > One step in this directory is to change a little bit the evaluation of
> > the top-level forms. I would suggest that in the process of
> > initializing modules, we specify that all the DEFINE forms are
> > executed, in sequence, before the other top-level forms.
>
> If this is an issue, I would rather just say that all definitions must
> precede non-definitions.
That's fine with me.
> > 5- add type exportations.
>
> I still believe that this should be put into a library, but my opinion
> relies on being able to write macros that expand to `provide'.
Being able to right macros that expand to PROVIDE is in contradiction
with the Mike's proposal. However, I don't see how it is related to
exporting types. Could you elaborate on that?
--
Manuel
More information about the R6RS
mailing list