https://github.com/remexre/cl-wadler-pprint
An implementation of A Prettier Printer in Common Lisp.
https://github.com/remexre/cl-wadler-pprint
common-lisp pretty-print
Last synced: 2 months ago
JSON representation
An implementation of A Prettier Printer in Common Lisp.
- Host: GitHub
- URL: https://github.com/remexre/cl-wadler-pprint
- Owner: remexre
- Created: 2019-09-22T02:11:22.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2019-09-29T13:36:05.000Z (over 5 years ago)
- Last Synced: 2025-02-15T00:41:21.906Z (4 months ago)
- Topics: common-lisp, pretty-print
- Language: Common Lisp
- Size: 35.2 KB
- Stars: 7
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
cl-wadler-pprint
================An implementation of ["A Prettier Printer" by Philip Wadler](https://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf) in Common Lisp.
Example
-------```lisp
(defclass foo ()
((bar :initarg :bar :reader bar)
(baz :initarg :baz :reader quux)))(def-pretty-object foo ()
(bar baz)); at width 80
(pretty t (make-instance 'foo :bar 1 :baz 2))
; #; at width 20
(pretty t (make-instance 'foo :bar 1 :baz 2))
; #
```TODOs
------ It might make sense to use laziness and/or memoization to speed up pretty-printing.
Notes
-----### ABCL
In my entrypoint (written in Java), I've got a method:
```java
import java.io.IOException;
import java.util.Scanner;
import org.armedbear.lisp.JavaObject;
import org.armedbear.lisp.Packages;public static void updateRightMargin() {
int rightMargin;
try {
Process proc = new ProcessBuilder("tput", "cols")
.inheritIO()
.redirectOutput(ProcessBuilder.Redirect.PIPE)
.start();
rightMargin = new Scanner(proc.getInputStream()).nextInt();
if(proc.waitFor() != 0) {
logError("Failed to update *PRINT-RIGHT-MARGIN*.");
return;
}
} catch(InterruptedException ex) {
logError("Failed to update *PRINT-RIGHT-MARGIN*: " + ex);
return;
} catch(IOException ex) {
logError("Failed to update *PRINT-RIGHT-MARGIN*: " + ex);
return;
}Packages.findPackage("COMMON-LISP")
.findAccessibleSymbol("*PRINT-RIGHT-MARGIN*")
.setSymbolValue(JavaObject.getInstance(rightMargin, true));
}
```and in `main`, code like:
```java
import sun.misc.Signal;
import sun.misc.SignalHandler;Signal.handle(new Signal("WINCH"), new SignalHandler() {
public void handle(Signal sig) {
Main.updateRightMargin();
}
});
updateRightMargin();
```