| 1 | ============================== |
|---|
| 2 | Design of lisp streams in ABCL |
|---|
| 3 | ============================== |
|---|
| 4 | |
|---|
| 5 | The previous design |
|---|
| 6 | ------------------- |
|---|
| 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. |
|---|
| 13 | |
|---|
| 14 | The problem with the previous design |
|---|
| 15 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 16 | |
|---|
| 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. |
|---|
| 24 | |
|---|
| 25 | .. image:: pprint-problem.png |
|---|
| 26 | |
|---|
| 27 | The planned future design and solution to the problem |
|---|
| 28 | ----------------------------------------------------- |
|---|
| 29 | |
|---|
| 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. |
|---|
| 34 | |
|---|
| 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. |
|---|
| 39 | |
|---|
| 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. |
|---|
| 43 | |
|---|
| 44 | .. image:: pprint-solution.png |
|---|