source: trunk/abcl/doc/design/streams/design.rst

Last change on this file was 13254, checked in by Mark Evenson, 10 years ago

Reformat to 80 columns

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