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

*PACKAGE* rebound by debugger



    Date: Fri, 27 May 88 13:19 EDT
    From:     barmar@Think.COM (Barry Margolin)

    There's a piece of behavior of the Genera that has been bothering many
    users here for a long time.  We've been complaining about it since at
    least 7.0.  We developed a kludgey patch around it, but since we just
    discovered that the patch didn't work in 7.2 (all the references to
    ZL:PACKAGE had to be changed to *PACKAGE*), they've started bugging me
    about it.  I'm CCing SLUG to find out whether other users find this
    behavior obnoxious.

    The complaint is that when you get an error during loading a file,
    *PACKAGE* is generally bound by the debugger to something like CL-USER,
    rather than being left bound to the package the file was being loaded
    into.  The files have packages in their attribute lists and also contain
    IN-PACKAGE as their first form.

It's intentional that the Debugger do this.  The idea is that the
Debugger and break loops shuold run in a known and predictable
environment.  If you want to change *PACKAGE* in a way that causes the
Debugger to not re-bind it, use (SETF (SYS:STANDARD-VALUE XXX) YYY).
It turns out the :Set Package and ZL:PKG-GOTO do this as part of their
contract.

    The same thing also happens if the user uses IN-PACKAGE interactively to
    change his default package rather than the :Set Package command or
    ZL:PKG-GOTO.

    This automatic rebinding of *PACKAGE* makes it a pain to debug, because
    you have to use package prefixes to reference all the variables of the
    program that failed.  IN-PACKAGE is the standard Common Lisp function
    for changing the default package.

You could just type :Set Package in the Debugger.

    The workaround patch some of our users use is:

    (setq si:*standard-bindings*
	  (delete '*package* si:*standard-bindings* :key #'car))

    (si:advise-permanently si:setq-standard-value-2 :around package-hack nil
      (if (and (eq (car arglist) '*package*)
	       (packagep (cadr arglist)))
	  (setq *package* (cadr arglist))
	  :do-it))

    Is this behavior intentional or have you just not gotten around to
    fixing it?  I've tried to justify it to my users, with arguments like
    "it's trying to pretend that default packages are associated with I/O
    streams" (I've long believed that reader/printer options such as
    *READ-BASE*, *PRINT-ARRAY*, and *READTABLE* should be able to be
    specified when opening a character stream, and have those be the
    defaults when doing I/O to the stream), but they don't buy it.  All they
    see, and I can understand their point, is that they need to debug a
    program that was loading into the *LISP package, and they've been pulled
    arbitrarily into the CL-USER package.