[R6RS] modules

Michael Sperber sperber
Sun Aug 29 17:46:07 EDT 2004

>>>>> "Kent" == R Kent Dybvig <dyb at cs.indiana.edu> writes:

Kent> The point is that the "import" may not actually appear in the code, just
Kent> a symbol, keyword, or local variable with the same name; the a in (a x)
Kent> may expand into quote, or x may be a auxiliary keyword recognized by a,
Kent> or x may be bound by some enclosing imported construct.  Maybe a couple of
Kent> more elaborate examples would help.  Let's say instead of (a x) we have:

Kent> (module ---
Kent>   (require (only new-math sin asin))
Kent>   (require (only case-tools state-case bind-stuff))
Kent>   ---
Kent>   (bind-stuff ((x sin) ---)
Kent>     (state-case (find-next q)
Kent>       ---
Kent>       [(sin x) (make-sine-wave x)]
Kent>       ---))
Kent>   ---)

Kent> Is there a reference to the new-math sin in this code?  Not if bind-stuff
Kent> creates a local binding for sin or state-case treats it as a keyword or
Kent> quoted symbol.

The examples in this thread are beginning to trouble me more and more:
You seem to expect that, with some unhygienic extension of
SYNTAX-RULES in place, it will *and should* be common for programmers
to introduce forms that implicitly bind (not explicitly named)
identifiers.  (As, in fact, a local import form would do.)  Is this
inference correct?

If it is, the more I think about it, the less I like this scenario,
and I think it will lead to code so hard to read that eliminating
superfluous imports will be the least of the programmer's problems.

Kent> It's just this kind of thing:

Kent>   (let ((cons 3))
Kent>     (require only-for-syntax scheme)
Kent>     cons)

Kent> I prefer that this be an out-of-context error, since I don't like
Kent> having two visible bindings, usable or not, for the same identifier in
Kent> the same scope.  But one could say that the require-for-syntax doesn't
Kent> shadow run-time bindings, just compile-time bindings, so that it should
Kent> evaluate to 3.

Ah.  Oh.  From the name "only-for-syntax" I was quite sure that
"*only* for syntax" would mean *no* run-time binding.  This would
imply that there's no way the CONS in the LET body could and should be
affected by an "only-for-syntax" REQUIRE.

I think I would really like the import form to be clearly and
explicitly phased, with no form that does both at the same time.
This, I think, will encourage a much clearer expression of the phase
separation in the code.

(For all of these phase separation issues, however, I completely defer
to and agree with Matthew, who I (currently) believe has it all
figured out.)

Cheers =8-} Mike
Friede, V?lkerverst?ndigung und ?berhaupt blabla

More information about the R6RS mailing list