diff --git a/2019/lynn/README.md b/2019/lynn/README.md
index 2e4cb2648..830f6d94e 100644
--- a/2019/lynn/README.md
+++ b/2019/lynn/README.md
@@ -1,27 +1,36 @@
# Most functional compiler
-Ben Lynn
-
-Twitter: @bmxlynn
+ Ben Lynn
+
+ Twitter: @bmxlynn
+# To build:
-## Judges' comments:
-### To use:
+```sh
+make
+```
- make
+### To run:
+
+```sh
+./prog
+```
### Try:
- (./prog < fib.hs; cat prog.c) > fib.c
- cc fib.c -o fib
- ./fib
+```sh
+(./prog < fib.hs; cat prog.c) > fib.c
+cc fib.c -o fib
+./fib
+```
-### Selected Judges Remarks:
+## Judges' comments:
A fully functional compiler. The example prints out the 30th Fibonacci number.
## Author's comments:
-# Remarks #
+
+### Remarks
A Haskell compiler. Supports a subset of Haskell more than large enough to
self-host. Like GHC with custom language extensions:
@@ -40,24 +49,30 @@ self-host. Like GHC with custom language extensions:
* `SyntaxForTheMasses`: See below.
-## Demos ##
+### Demos
Build the compiler:
- $ $(CC) -o prog prog.c
+```sh
+cc -o prog prog.c
+```
### Fibonacci numbers
Test the compiler on `fib.hs`:
- $ (./prog < fib.hs ; cat prog.c) > fib.c
+```sh
+(./prog < fib.hs ; cat prog.c) > fib.c
+```
Compiling the output produces a binary that prints the 30th Fibonacci number.
The file `ghcfib.hs` includes `fib.hs` with some glue code, and shows GHC
also accepts our subset of Haskell:
- $ ghc ghcfib.hs
+```sh
+ ghc ghcfib.hs
+```
### Self-hosting compiler
@@ -66,7 +81,9 @@ instead provide `hint.hs`, the output of a certain stage of the compiler when
run on itself. This intermediate output is hopefully difficult to understand,
yet is accepted by our compiler:
- $ (./prog < hint.hs ; cat prog.c) > hint.c
+```sh
+(./prog < hint.hs ; cat prog.c) > hint.c
+```
The output program behaves like the compiler itself.
@@ -83,24 +100,32 @@ languages"](https://www.cs.dartmouth.edu/~doug/nfa.pdf). We exercise it by
showing the first entries of the length-ordered list of all strings consisting
of the characters a and b that contain an even number of a's.
- $ (./prog < lol.hs ; cat prog.c) > lol.c
+```sh
+(./prog < lol.hs ; cat prog.c) > lol.c
+```
A GHC wrapper is provided:
- $ ghc ghclol.hs
+```sh
+ghc ghclol.hs
+```
### Strongly-connected components
See `scc.hs` (and its GHC wrapper `ghcscc.hs`) for an elegant way to print the
strongly-connected components of a graph in reverse topological order.
- $ (./prog < scc.hs ; cat prog.c) > scc.c
+```sh
+(./prog < scc.hs ; cat prog.c) > scc.c
+```
It expects the input to be in a similar format as a previous entry
(2018 vokes). Indeed, obtain the 2018 winners, and run:
- $ ./scc < 2018/vokes/example-1.txt
- $ ./scc < 2018/vokes/example-2.txt
+```sh
+./scc < 2018/vokes/example-1.txt
+./scc < 2018/vokes/example-2.txt
+```
The output should agree, though our program omits line numbers and does not
sort entries within a line. (Also, our program only treats spaces as
@@ -185,7 +210,7 @@ or rather, a compiler that accepts a subset of Haskell sufficiently large to
self-host. You might say I wrote a tool for this contest, then ran it on itself
to make an entry for it.
-## Obfuscation techniques ##
+### Obfuscation techniques
Even with Kiselyov's algorithm and some term rewriting, the compiler only fit
after compression, which naturally obfuscates the code. More tricks were needed
@@ -239,7 +264,7 @@ year](http://okmij.org/ftp/tagless-final/ski.pdf).
parser combinators, lambda calculus, bracket abstraction, denotational
semantics, etc.
-## Warnings ##
+### Warnings
On my system, it compiles cleanly with `-Wall` with older standards, e.g.
`-std=c89`, but less cleanly if `-pedantic` is also supplied.
@@ -247,16 +272,15 @@ On my system, it compiles cleanly with `-Wall` with older standards, e.g.
Compiling the compiler output with `-Wall` triggers a warning about a
strange-looking comment.
-## Behind-the-scenes commentary ##
+### Behind-the-scenes commentary
[My website reveals how this compiler
works.](https://crypto.stanford.edu/~blynn/compiler/ioccc.html)
---------------------------------------------------------------------------------
-