[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
compile-time processing of REQUIRE
re: Am I correct that REQUIRE forms appearing at top level are not supposed
to be evaluated at compile time? It is not in the list of magic
functions on p. 182 of CLtL. However, both VaxLisp and Lucid . . .
I have been under the impression that the compilation interface is one
area where CLtL, as a specification, didn't succeed very well. Although
no complete guarantee can be given to insure package layout consistency,
it seems to me that the usage pattern of REQUIRE (but *not* PROVIDE) is
such that it should be implicitly recognized by the compiler interface.
For example, see Table 11-1 of CLtL, p189:
;;;; Lisp init file for I. Newton
;;; Set upthe USER pacakge the wayk I like it.
(require 'calculus) ;I use CALCULUS a lot. Load it.
(use-package 'calculus) ;Get easy access to its exported symbols
. . .
;;; Import only what I need into the USER package.
(require 'relativity)
(import '(relativity:speed-of-light)...)
Quite evidently, the CALCULUS package is created and set up by the
calculus module; and parameters with names like RELATIVITY:SPEED-OF-LIGHT
are defined in the RELATIVITY module (indeed, isn't this the intention of
"modular" programming!). Thus this example, as a file, would not be
compilable unless the REQUIRE statements are executed, in the order in
which they appear, during the file compilation.
In addition to REQUIRE, Lucid has added UNINTERN to the set of forms
implicitly wrapped in an eval-when(eval compile load). Note that there
is nothing stopping the programmer from using his own wrappers, which
will have precedence over the implicit one.
Incidentally, one other area where I personally violate the CLtL
suggestions on package usage is in the placement of PROVIDE statements.
Section 11.9 suggests placeing them first in a file, and the cutsy little
mnemonic on page 191 -- PutInSevenExtremelyRandomUserInterfaceCommands --
also does that. But because loading a lisp file is a dynamic action
with ocasionally loooooong duration, and because it is very easy to
abort the loading right in the middle -- either interactively or through
the error system -- then I place my PROVIDE's last, so that the *MODULES*
list will not actually be updated until the whole module is fully present.
One final point: I've used the word "statements" to refer to these
functions. I hope you don't think that I'm just some kind of nerd who
learned Lisp yesterday and doesn't know enough to refer to these sorts
of things as "forms" or "s-expressions" or whatever. In fact the
functionality provided by these "...ExtremelyRandomUserInterface..."
commands is very much like that of a JobControlLanguage. That is why
I refer to them as "statements".
Allow me, if you will, to express one more very strong opinion: I
definitely prefer to write my "statements" in Lisp syntax rather than
in YAJCL*, or FORTRAN, or even the Emacs-inspired "File Attribute"
syntax of the MIT Lisp machine descendents. [Lisp is "good enough";
it does the job.]
-- JonL --
* = YetAnotherJobControlLanguage