From: Peter G. <pe...@ar...> - 2004-06-13 19:54:08
|
On Sun, 13 Jun 2004 at 20:33:06 +0200, Andras Simon wrote: > I cleaned up the mess I made. No problem. However... (setf (symbol-function 'sys::%force-output) #'gray-force-output) (setf (symbol-function 'sys::%finish-output) #'gray-finish-output) (setf (symbol-function 'sys::%clear-output) #'gray-clear-output) As things stand, this isn't really going to work, because %force-output (for example) is a built-in. The compiler inlines calls to built-ins, in the sense that if you do: (defun foo () (sys::%force-output *standard-output*)) and then compile the function FOO (or COMPILE-FILE its file), the compiler, in effect, does (SYMBOL-FUNCTION 'SYS::%FORCE-OUTPUT) at the time the compiled function is loaded, so if you load gray-streams later, changing the function the symbol SYS::%FORCE-OUTPUT refers to won't have any effect on the compiled function FOO; it will still call the original function. A "built-in", for the purposes of this discussion, is any function (or, more precisely, any symbol) for which SYS::BUILT-IN-FUNCTION-P returns true. In practice, this is any function that's available at the very beginning of boot.lisp, meaning a function that is defined in a .java file and that is not an autoload. So the whole section at the end of gray-streams.lisp that revectors a bunch of functions to their gray-streams-aware replacements isn't going to work reliably with compiled code, although it might work on a good day, depending on the exact order in which things are loaded and/or compiled. (It would help to load gray-streams as early as possible, but it might not be possible to load it early enough, if it depends on other files.) The original version of pprint.lisp was subject to the same problem until very recently (yesterday?), when I finished refactoring things so that the CL functions that are redefined in pprint.lisp were moved out of .java files into boot.lisp. For example, FORCE-OUTPUT was formerly defined as a built-in in Primitives.java; now, SYS::%FORCE-OUTPUT is defined as a built-in in Primitives.java and FORCE-OUTPUT is defined in boot.lisp to just call SYS::%FORCE-OUTPUT, so that things will work correctly when FORCE-OUTPUT is later redefined in pprint.lisp. So, in the case of FORCE-OUTPUT and friends, I think you should just do (setf (symbol-function 'force-output) #'gray-force-output) (setf (symbol-function 'finish-output) #'gray-finish-output) (setf (symbol-function 'clear-output) #'gray-clear-output) The CL functions (FORCE-OUTPUT, FINISH-OUTPUT and CLEAR-OUTPUT) are no longer built-ins, so revectoring them should work correctly. Some of the other functions that are revectored at the end of gray- streams.lisp are still built-ins, however, so that doesn't solve the whole problem. The real problem is that the approach taken by pprint.lisp and gray- streams.lisp is fundamentally wrong. We probably want to keep those files for now and live with the wrong approach, because those files do provide useful functionality. But in the long run, what's needed is a rework of the architecture so that streams can be sensibly extended to things like XP streams and/or Gray streams without having to revector all the functions that operate on them. The kinds of streams we need should be there in the architecture, not retrofitted after the fact. I do plan to do this, but I may not get around to it for a while. In the meantime, I hope we can struggle along with what we've got. Pretty-printing is fixed (I think), and the only thing that really depends on gray-streams is slime; maybe it's possible to enforce a particular load order in that situation. -Peter |