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

Compiling CASE

    Date: Saturday, 11 April 1987  06:07-EDT
    From: Hvatum at MIT-MULTICS.ARPA
    Re:   Compiling CASE
    The package system will not protect Common LISP from having its
    functions redefined, since a user who wants to define his/her own CAR
    function will likely not call it USER:CAR; thus, since there is
    already a CAR in the LISP package, that's the one that will get

This is what SHADOW is for.
    [...]  What if the function was not
    CAR, but (say) ENCODE-UNIVERSAL-TIME?  It is reasonable to suppose
    that Joe Lisphacker will not wish to look up every potential
    function name to see if it is already defined.  [...]

It is reasonable to suppose that programmers won't want to look up
every symbol before they use it, but it is not reasonable to redefine
system functions.  Programs that redefine system functions are not
portable for two reasons:
 -- You might redefine a system facility that other parts of the
    system depend on, for example, it you redefine
    DECODE-UNIVERSAL-TIME, our compiler will not work.
 -- Even if a program attempts to redefine a facility in an upward
    compatible way, that program cannot coexist with other programs
    that redefine the same facility an in incompatible upward
    compatible way.

Just as in COBOL, the programming environment should provide ways to
prevent users from screwing themselves by redefining the system.

    [...] It is also not reasonable for the compiler to reject this
    usage because it is an error to redefine ENCODE-UNIVERSAL-TIME
    [...].  It's also likely that the interpreter will make different
    choices in the same matter, probably all bad ones.

This is another good reason to forbid redefinition of standard
functions and macros.  If you allow redefinition, then you must
specify what the result is; this is difficult to do in the presence of
a variety of implementations of evaluation such as compilers and

Note on a point of dogma: it doesn't make any sense to say that a
construct is "Legal in Common Lisp but implementation dependent";
Common Lisp is nothing if not a specification of how to write portable
Lisp programs.  In some cases it is reasonable for Common Lisp to
suggest standard mechanisms for accessing common implementation
features, but programs that rely on such constructs having any
particular effect are not portable, and thus not really Common Lisp