[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

eval-when [former subject evalhook, eval-when]



    Date: Fri, 6 Mar 1987  13:24 EST
    From: Rob MacLachlan <RAM@C.CS.CMU.EDU>

	Now for EVAL-WHEN. The problem here is that the concepts of COMPILE,
	LOAD, and EVAL phases don't apply in an incrementally compiled Lisp -

    Yes, there are major problems with the specification of EVAL-WHEN.
    The compiler cleanup committee is currently working on this, but we
    probably can't offer a great deal of help since the only proposal that
    deals with these problems advocates flushing EVAL-WHEN and replacing
    it with new special forms.

    Although Moon presumably knows the ancestral meaning of EVAL-WHEN, 

In fact I was working from your proposal for the semantics of compilation
when I said what I said (of course keeping the name EVAL-WHEN since we're
discussing Common Lisp as it is today, not as it might be after it's
cleaned up in various ways).  In other words, the distinctive thing about
COMPILE-FILE is early evaluation and late evaluation taking place in
different Lisp worlds, not anything about representation of programs as
executable machine instructions.

								       I
    don't agree with his interpretation of it on the basis of dumping to
    files.  The rules for evaluation should exist independently of any
    semantics of COMPILE-FILE.

In general that's true, but certainly the rules for evaluating EVAL-WHEN
are intimately connected with the semantics of COMPILE-FILE.

    My current opinion that there are only three EVAL-WHEN situation
    lists that can be used in portable code:
	 (compile load eval)
	 (load eval)
	 (compile eval)
    The reason for this restriction is that other situation lists allow
    programs to "tell the difference" between a compiled and an interpreted
    implementation.

    Given that only these situation lists are used, a compile-only system
    can entirely ignore the EVAL situation, and interpret COMPILE as "do
    it now" and LOAD as "do it eventually."  In any situation where the
    EVAL-WHEN body is not evaluated, the result of the EVAL-WHEN is NIL.

I agree with this, for a strong definition of "portable code" as code
that will execute identically in all implementations.  A somewhat
weaker, but still extremely useful, definition of "portable code" as
code that will execute correctly in all implementations allows for
other situation lists.  For example, (eval-when (compile) ...) is
a portable way to get a compile-time-only definition, in systems where
that concept is meaningful; programs that use this can be written in
such a way that they work correctly in all systems.