I am writing the chapters of my Adventures relative to the R6RS module
system and to the phase separation concept.
In doing so, I realized that I am still missing a crucial point.
Therefore, I am asking for enlightenment here.

As I understand, there are three possible semantics for R6RS
implementations
(I may be using incorrect terminology, but it should be clear what I
mean):

1. full phase separation (mzscheme, Larceny); there is an infinite
tower of
   metalevels, and you are forced to specify at which phase you want
to import
   the names;

2. partial phase separation (Ikarus); importing a name imports it at
all
   levels;

3. no phase separation (REPL of Ikarus and Ypsilon).

The rationale for 1 is that some people (not me) want the freedom to
use different languages at different levels.

The rationale for 2 is that it is much easier and programmer friendly;
it also avoids the potentially infinite duplication of namespaces,
one
per level.

The rational for 3 is that at the REPL it is very convenient to define
a helper function and then use it directly in a macro defined later
on.

The point I am missing: why do not keep the semantics of the REPL
even for scripts and libraries? I mean in Ikarus. Clearly people
wanting full phase separation have no interest in this: actually
they force you to import explicitly even auxiliary macros, not
only auxiliary functions. Ikarus instead does not force you
to put auxiliary macros in a separate module.

Thinking is the same direction, it is clear that the compiler in
theory
has access to the helper functions defined before the macros they are
intended
to be used to, and it could make use of this knowledge. Instead,
R6RS-compatibility forces us to put the auxiliary functions in an
auxiliary
module and to import them.

I want to understand if you (Aziz and more generally the people here
which I believe are no fan of full phase separation) think that the
restriction from the R6RS is wrong and no phase separation at all
would be a better solution, or if I am just missing something and
perhaps the partial phase separation of splitting macros from
auxiliary
functions (and in general other names that would be define at runtime
only) is needed in some way. I mean, I would like to go in a direction
of no phase separation at all, where all names at toplevel are defined
both at compile time and at runtime. This was the semantic I expected
from day one when I learned Scheme, and it is the semantic
of the REPL.

Why we cannot keep it?

Reply via email to