Changeset 13254
- Timestamp:
- 03/20/11 20:25:03 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/doc/design/streams/design.rst
r12410 r13254 6 6 ------------------- 7 7 8 Previously, ABCL streams were built-in classes. This presented some problems for Gray streams, 9 because ABCL CLOS can't use a built-in class as a base class, and Gray streams derive from 10 a system-stream class. This was corrected by converting ABCL streams to be structure-objects 11 instead of built-in classes, allowing CLOS to derive from the streams. There was, however, another 12 problem that revealed a need to change the design in more drastic ways. 8 Previously, ABCL streams were built-in classes. This presented some 9 problems for Gray streams, because ABCL CLOS can't use a built-in 10 class as a base class, and Gray streams derive from a system-stream 11 class. This was corrected by converting ABCL streams to be 12 structure-objects instead of built-in classes, allowing CLOS to derive 13 from the streams. There was, however, another problem that revealed a 14 need to change the design in more drastic ways. 13 15 14 16 The problem with the previous design 15 17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 16 18 17 While converting the streams from built-in classes to structure-objects allowed derivation, 18 the pretty printer still didn't work with Gray streams. Gray streams replace the system stream 19 functions, saving the old function symbols so that they can be later invoked. The pretty printer, 20 however, just replaces the stream functions, and calls the low-level primitives directly, thus 21 bypassing Gray streams completely. The attached image portrays the problem, where pprint will, 22 for example, invoke %stream-write-char, thus bypassing any methods that there may be for 23 stream-write-char using Gray streams. 19 While converting the streams from built-in classes to 20 structure-objects allowed derivation, the pretty printer still didn't 21 work with Gray streams. Gray streams replace the system stream 22 functions, saving the old function symbols so that they can be later 23 invoked. The pretty printer, however, just replaces the stream 24 functions, and calls the low-level primitives directly, thus bypassing 25 Gray streams completely. The attached image portrays the problem, 26 where pprint will, for example, invoke %stream-write-char, thus 27 bypassing any methods that there may be for stream-write-char using 28 Gray streams. 24 29 25 30 .. image:: pprint-problem.png … … 28 33 ----------------------------------------------------- 29 34 30 The solution to the problem is quite similar to how SBCL does its streams. First of all, the pretty printer will 31 no longer replace stream functions. The stream functionality will be based on closures in the slots of 32 the structure-object representing the stream, and those closures will invoke low-level i/o functions that 33 are stream-specific. 35 The solution to the problem is quite similar to how SBCL does its 36 streams. First of all, the pretty printer will no longer replace 37 stream functions. The stream functionality will be based on closures 38 in the slots of the structure-object representing the stream, and 39 those closures will invoke low-level i/o functions that are 40 stream-specific. 34 41 35 The pretty printer will just setup closures that will extract the underlying stream 36 object from a pprint-wrapped stream, and invoke its low-level functions. If pprint wrapping isn't present, 37 the slots will contain closures that directly invoke low-level functions of streams. Gray streams will 38 still replace the stream functions, because it's capable of invoking the replaced functions. 42 The pretty printer will just setup closures that will extract the 43 underlying stream object from a pprint-wrapped stream, and invoke its 44 low-level functions. If pprint wrapping isn't present, the slots will 45 contain closures that directly invoke low-level functions of 46 streams. Gray streams will still replace the stream functions, because 47 it's capable of invoking the replaced functions. 39 48 40 In addition to these changes, it is planned that the stream function primitives will be moved from the Stream 41 java class to a streamfunctions library, allowing the stream functions to be written in lisp rather than java. 42 There's an ongoing aspiration to increase the lisp/java code ratio of ABCL, and this new design allows for that. 49 In addition to these changes, it is planned that the stream function 50 primitives will be moved from the Stream java class to a 51 streamfunctions library, allowing the stream functions to be written 52 in lisp rather than java. There's an ongoing aspiration to increase 53 the lisp/java code ratio of ABCL, and this new design allows for that. 43 54 44 55 .. image:: pprint-solution.png
Note: See TracChangeset
for help on using the changeset viewer.