summaryrefslogtreecommitdiff
path: root/chapter10a/docs
diff options
context:
space:
mode:
Diffstat (limited to 'chapter10a/docs')
-rw-r--r--chapter10a/docs/10-grammar.md125
-rw-r--r--chapter10a/docs/Makefile1
-rw-r--r--chapter10a/docs/example1.gv16
-rw-r--r--chapter10a/docs/example1.json23
-rw-r--r--chapter10a/docs/example1.svg118
-rw-r--r--chapter10a/docs/example2a.gv17
-rw-r--r--chapter10a/docs/example2a.json26
-rw-r--r--chapter10a/docs/example2a.svg130
-rw-r--r--chapter10a/docs/example2b.gv19
-rw-r--r--chapter10a/docs/example2b.json27
-rw-r--r--chapter10a/docs/example2b.svg135
-rw-r--r--chapter10a/docs/example2c.gv14
-rw-r--r--chapter10a/docs/example2c.json21
-rw-r--r--chapter10a/docs/example2c.svg109
-rw-r--r--chapter10a/docs/lattice.gv127
-rw-r--r--chapter10a/docs/lattice.svg593
-rw-r--r--chapter10a/docs/load-after-store-after.json19
-rw-r--r--chapter10a/docs/load-after-store-after.svg97
-rw-r--r--chapter10a/docs/load-after-store-before.json20
-rw-r--r--chapter10a/docs/load-after-store-before.svg103
-rw-r--r--chapter10a/docs/type-control.svg5
-rw-r--r--chapter10a/docs/type-integer.svg5
-rw-r--r--chapter10a/docs/type-memory.svg5
-rw-r--r--chapter10a/docs/type-pointer.svg5
-rw-r--r--chapter10a/docs/type-struct.svg5
-rw-r--r--chapter10a/docs/type-tuple.svg5
26 files changed, 0 insertions, 1770 deletions
diff --git a/chapter10a/docs/10-grammar.md b/chapter10a/docs/10-grammar.md
deleted file mode 100644
index 5b9b680e..00000000
--- a/chapter10a/docs/10-grammar.md
+++ /dev/null
@@ -1,125 +0,0 @@
-# Grammar for Chapter 10a
-
-```antlrv4
-grammar SimpleLanguage;
-
-program
- : statement+ EOF
- ;
-
-statement
- : returnStatement
- | structDeclaration
- | declStatement
- | blockStatment
- | expressionStatement
- | ifStatement
- | whileStatement
- | breakStatement
- | continueStatment
- ;
-
-field
- : 'int' IDENTIFIER ';'
- ;
-
-fields
- : field+
- ;
-
-structDeclaration
- : 'struct' IDENTIFIER '{' fields '}'
- ;
-
-whileStatement
- : 'while' '(' expression ')' statement
- ;
-
-breakStatement
- : 'break' ';'
- ;
-
-continueStatement
- : 'continue' ';'
- ;
-
-ifStatement
- : 'if' '(' expression ')' statement ('else' statement)?
- ;
-
-
-expressionStatement
- : IDENTIFIER '=' expression ';'
- | fieldExpression '=' expression ';'
- ;
-
-blockStatement
- : '{' statement+ '}'
- ;
-
-structName
- : IDENTIFIER
- ;
-
-declStatement
- : 'int' IDENTIFIER '=' expression ';'
- | structName ('?')? IDENTIFIER '=' expression ';'
- ;
-
-returnStatement
- : 'return' expression ';'
- ;
-
-expression
- : comparisonExpression
- ;
-
-comparisonExpression
- : additiveExpression (('==' | '!='| '>'| '<'| '>='| '<=') additiveExpression)*
- ;
-
-additiveExpression
- : multiplicativeExpression (('+' | '-') multiplicativeExpression)*
- ;
-
-multiplicativeExpression
- : unaryExpression (('*' | '/') unaryExpression)*
- ;
-
-unaryExpression
- : ('-') unaryExpression
- | '!' unaryExpression
- | primaryExpression
- ;
-
-newExpression
- : 'new' IDENTIFIER
- ;
-
-fieldExpression
- : primaryExpresson '.' IDENTIFIER
- ;
-
-primaryExpression
- : IDENTIFIER
- | INTEGER_LITERAL
- | 'true'
- | 'false'
- | 'null'
- | newExpression
- | '(' expression ')'
- | fieldExpression
- ;
-
-INTEGER_LITERAL
- : [1-9][0-9]*
- | [0]
- ;
-
-IDENTIFIER
- : NON_DIGIT (NON_DIGIT | DIGIT)*
- ;
-
-NON_DIGIT: [a-zA-Z_];
-DEC_DIGIT: [0-9];
-```
diff --git a/chapter10a/docs/Makefile b/chapter10a/docs/Makefile
deleted file mode 100644
index 6fa0f057..00000000
--- a/chapter10a/docs/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-include ../../graph/docs.mk
diff --git a/chapter10a/docs/example1.gv b/chapter10a/docs/example1.gv
deleted file mode 100644
index 9585b8e4..00000000
--- a/chapter10a/docs/example1.gv
+++ /dev/null
@@ -1,16 +0,0 @@
-digraph Memory {
- // IR styles match graph/web/render.js; arrows are use -> definition.
- graph [bgcolor="#fafbfc" fontname="Helvetica" nodesep=0.35 ranksep=0.55 splines=ortho];
- node [fontname="Helvetica" fontsize=12 color="#758191" fontcolor="#152330" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- edge [fontname="Helvetica" fontsize=9 color="#536477" fontcolor="#364352" arrowsize=0.7 penwidth=1.5];
-
- rankdir=RL;
-
- M0 [label="Initial memory" shape=octagon style="filled" fillcolor="#dcecff"];
- X [label="Store p.x = 3" shape=octagon style="filled" fillcolor="#dcecff"];
- Y [label="Store p.y = arg" shape=octagon style="filled" fillcolor="#dcecff"];
- L [label="Load p.x" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- L -> Y -> X -> M0 [color="#2867b2"];
- Return -> Y [color="#2867b2"]; Return -> L;
- Return [shape=box style="filled" fillcolor="#fff1c4"];
-}
diff --git a/chapter10a/docs/example1.json b/chapter10a/docs/example1.json
deleted file mode 100644
index 07e1dfef..00000000
--- a/chapter10a/docs/example1.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "ver": 1,
- "comp": "chapter10a/docs/example1.svg",
- "step": 1,
- "roots": [13],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 4, "label": "arg", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "DATA", "label": null}], "proj": {"par": 1, "idx": 2}},
- {"id": 5, "label": "new Point", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.y", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 9, "label": "#3", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 10, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 9, "role": "DATA", "label": null}], "proj": null},
- {"id": 11, "label": "Store p.y", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 10, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 4, "role": "DATA", "label": null}], "proj": null},
- {"id": 12, "label": "Load p.x", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 11, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 0, "role": "DATA", "label": null}], "proj": null},
- {"id": 13, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 11, "role": "MEM", "label": null}, {"idx": 2, "def": 12, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/example1.svg b/chapter10a/docs/example1.svg
deleted file mode 100644
index d98e0ccd..00000000
--- a/chapter10a/docs/example1.svg
+++ /dev/null
@@ -1,118 +0,0 @@
-<svg aria-label="Compiler graph" width="621" height="766" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 621 766" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M419,46 C419,70 84,41 84,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M236,118 L236,166" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M514,118 L514,123 Q514,128 509,128 L268,128 Q260,128 260,136 L260,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M84,118 L84,130 Q84,138 92,138 L276,138 Q284,138 284,146 L284,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M248,222 L248,227 Q248,232 253,232 L273,232 Q281,232 281,240 L281,270" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M514,118 L514,123 Q514,128 509,128 L326,128 Q318,128 318,136 L318,225.5 Q318,232 311.5,232 L311.5,232 Q305,232 305,238.5 L305,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M84,118 L84,130 Q84,138 92,138 L321,138 Q329,138 329,146 L329,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #6 · DATA</title></path><path class="edge ASSOC" id="e9i0" d="M419,46 C419,70 434,249 434,273" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#9[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e10i1" d="M293,326 L293,331 Q293,336 298,336 L331,336 Q339,336 339,344 L339,374" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[1] → #8 · MEM</title></path><path class="edge DATA" id="e10i2" d="M514,118 L514,123 Q514,128 509,128 L509,128 Q504,128 504,133 L504,224 Q504,232 496,232 L371,232 Q363,232 363,240 L363,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[2] → #5 · DATA</title></path><path class="edge DATA" id="e10i3" d="M434,326 L434,331 Q434,336 429,336 L395,336 Q387,336 387,344 L387,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[3] → #9 · DATA</title></path><path class="edge MEM" id="e11i1" d="M351,430 L351,435 Q351,440 356,440 L459,440 Q467,440 467,448 L467,478" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#11[1] → #10 · MEM</title></path><path class="edge DATA" id="e11i2" d="M514,118 L514,123 Q514,128 509,128 L509,128 Q504,128 504,133 L504,433.5 Q504,440 497.5,440 L497.5,440 Q491,440 491,446.5 L491,478" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#11[2] → #5 · DATA</title></path><path class="edge DATA" id="e11i3" d="M356,118 L356,130 Q356,138 364,138 L507,138 Q515,138 515,146 L515,478" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#11[3] → #4 · DATA</title></path><path class="edge MEM" id="e12i1" d="M479,534 L479,539 Q479,544 484,544 L517,544 Q525,544 525,552 L525,582" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#12[1] → #11 · MEM</title></path><path class="edge DATA" id="e12i2" d="M514,118 L514,123 Q514,128 519,128 L541,128 Q549,128 549,136 L549,582" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#12[2] → #5 · DATA</title></path><path class="edge MEM" id="e13i1" d="M479,534 L479,539 Q479,544 474,544 L472.5,544 Q466,544 466,550.5 L466,686" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#13[1] → #11 · MEM</title></path><path class="edge DATA" id="e13i2" d="M537,638 L537,643 Q537,648 532,648 L504,648 Q496,648 496,656 L496,686" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#13[2] → #12 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(176,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="120"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(176,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n4" data-id="4" transform="translate(296,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#4 arg
-Projection 2 of #1
-Type not computed
-
-[0] → #1 DATA</title></g><g class="node" id="n5" data-id="5" transform="translate(454,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Point</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Point
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(24,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(188,172)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(233,276)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.y</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.y
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n9" data-id="9" transform="translate(374,276)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#3</tspan><tspan class="node-id">  #9</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#9 #3
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n10" data-id="10" transform="translate(291,380)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#10 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → #9 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n11" data-id="11" transform="translate(419,484)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.y</tspan><tspan class="node-id">  #11</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#11 Store p.y
-Type not computed
-
-[0] → — CTRL
-[1] → #10 MEM
-[2] → #5 DATA
-[3] → #4 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n12" data-id="12" transform="translate(477,588)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Load p.x</tspan><tspan class="node-id">  #12</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#12 Load p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #11 MEM
-[2] → #5 DATA
-[3] → — DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="white"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n13" data-id="13" transform="translate(406,692)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #13</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#13 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #11 MEM
-[2] → #12 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/example2a.gv b/chapter10a/docs/example2a.gv
deleted file mode 100644
index 93a8a904..00000000
--- a/chapter10a/docs/example2a.gv
+++ /dev/null
@@ -1,17 +0,0 @@
-digraph Memory {
- // IR styles match graph/web/render.js; arrows are use -> definition.
- graph [bgcolor="#fafbfc" fontname="Helvetica" nodesep=0.35 ranksep=0.55 splines=ortho];
- node [fontname="Helvetica" fontsize=12 color="#758191" fontcolor="#152330" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- edge [fontname="Helvetica" fontsize=9 color="#536477" fontcolor="#364352" arrowsize=0.7 penwidth=1.5];
-
- rankdir=RL;
-
- M [label="Incoming memory" shape=octagon style="filled" fillcolor="#dcecff"];
- A [label="True: Store x" shape=octagon style="filled" fillcolor="#dcecff"];
- B [label="False: Store x" shape=octagon style="filled" fillcolor="#dcecff"];
- P [label="Phi(memory)" shape=hexagon style="filled" fillcolor="#f5e4fa"];
- P -> A -> M [color="#2867b2"]; P -> B -> M [color="#2867b2"];
- P -> Region [style=dashed,color="#9396a3"]; Return -> P [color="#2867b2"];
- Return [shape=box style="filled" fillcolor="#fff1c4"];
- Region [shape=trapezium style="filled" fillcolor="#fff1c4"];
-}
diff --git a/chapter10a/docs/example2a.json b/chapter10a/docs/example2a.json
deleted file mode 100644
index 7c22da0a..00000000
--- a/chapter10a/docs/example2a.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "ver": 1,
- "comp": "chapter10a/docs/example2a.svg",
- "step": 1,
- "roots": [19],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 5, "label": "new Point", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.y", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 10, "label": "True", "type": null, "kind": "CTRL", "edges": [], "proj": {"par": 0, "idx": 0}},
- {"id": 11, "label": "False", "type": null, "kind": "CTRL", "edges": [], "proj": {"par": 0, "idx": 1}},
- {"id": 12, "label": "#3", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 13, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 10, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 12, "role": "DATA", "label": null}], "proj": null},
- {"id": 14, "label": "#4", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 15, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 11, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 14, "role": "DATA", "label": null}], "proj": null},
- {"id": 17, "label": "Phi $mem", "type": null, "kind": "PHI", "edges": [{"idx": 0, "def": 0, "role": "ASSOC", "label": null}, {"idx": 1, "def": 13, "role": "MEM", "label": null}, {"idx": 2, "def": 15, "role": "MEM", "label": null}], "proj": null},
- {"id": 18, "label": "Load p.x", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 17, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 0, "role": "DATA", "label": null}], "proj": null},
- {"id": 19, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 17, "role": "MEM", "label": null}, {"idx": 2, "def": 18, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/example2a.svg b/chapter10a/docs/example2a.svg
deleted file mode 100644
index b7664907..00000000
--- a/chapter10a/docs/example2a.svg
+++ /dev/null
@@ -1,130 +0,0 @@
-<svg aria-label="Compiler graph" width="740" height="766" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 740 766" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M162,46 C162,70 409,41 409,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M99,118 L99,130 Q99,138 107,138 L167,138 Q175,138 175,146 L175,166" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M257,118 L257,123 Q257,128 252,128 L207,128 Q199,128 199,136 L199,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M409,118 L409,130 Q409,138 401,138 L231,138 Q223,138 223,146 L223,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M187,222 L187,227 Q187,232 182,232 L181,232 Q175,232 175,238 L175,270" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M257,118 L257,224 Q257,232 249,232 L207,232 Q199,232 199,240 L199,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M409,118 L409,234 Q409,242 401,242 L231,242 Q223,242 223,250 L223,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #6 · DATA</title></path><path class="edge ASSOC" id="e12i0" d="M162,46 C162,70 339,249 339,273" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#12[0] → #1 · ASSOC</title></path><path class="edge CTRL" id="e13i0" d="M65,326 L65,374" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#13[0] → #10 · CTRL</title></path><path class="edge MEM" id="e13i1" d="M187,326 L187,331 Q187,336 182,336 L97,336 Q89,336 89,344 L89,374" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#13[1] → #8 · MEM</title></path><path class="edge DATA" id="e13i2" d="M257,118 L257,123 Q257,128 252,128 L124,128 Q116,128 116,136 L116,344.5 Q116,346 114.5,346 L114.5,346 Q113,346 113,347.5 L113,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#13[2] → #5 · DATA</title></path><path class="edge DATA" id="e13i3" d="M339,326 L339,338 Q339,346 331,346 L145,346 Q137,346 137,354 L137,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#13[3] → #12 · DATA</title></path><path class="edge ASSOC" id="e14i0" d="M162,46 C162,70 598,249 598,273" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#14[0] → #1 · ASSOC</title></path><path class="edge CTRL" id="e15i0" d="M474,326 L474,374" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#15[0] → #11 · CTRL</title></path><path class="edge MEM" id="e15i1" d="M187,326 L187,331 Q187,336 192,336 L490,336 Q498,336 498,344 L498,374" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#15[1] → #8 · MEM</title></path><path class="edge DATA" id="e15i2" d="M257,118 L257,123 Q257,128 262,128 L519,128 Q527,128 527,136 L527,333.5 Q527,336 524.5,336 L524.5,336 Q522,336 522,338.5 L522,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[2] → #5 · DATA</title></path><path class="edge DATA" id="e15i3" d="M598,326 L598,331 Q598,336 593,336 L554,336 Q546,336 546,344 L546,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[3] → #14 · DATA</title></path><path class="edge MEM" id="e17i1" d="M101,430 L101,442 Q101,450 109,450 L557,450 Q565,450 565,458 L565,478" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#17[1] → #13 · MEM</title></path><path class="edge MEM" id="e17i2" d="M510,430 L510,435 Q510,440 515,440 L597,440 Q605,440 605,448 L605,478" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#17[2] → #15 · MEM</title></path><path class="edge MEM" id="e18i1" d="M585,534 L585,539 Q585,544 590,544 L636,544 Q644,544 644,552 L644,582" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#18[1] → #17 · MEM</title></path><path class="edge DATA" id="e18i2" d="M257,118 L257,123 Q257,128 262,128 L519,128 Q527,128 527,136 L527,224 Q527,232 535,232 L660,232 Q668,232 668,240 L668,582" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#18[2] → #5 · DATA</title></path><path class="edge MEM" id="e19i1" d="M585,534 L585,686" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#19[1] → #17 · MEM</title></path><path class="edge DATA" id="e19i2" d="M656,638 L656,643 Q656,648 651,648 L623,648 Q615,648 615,656 L615,686" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#19[2] → #18 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(39,24)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(39,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n5" data-id="5" transform="translate(197,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Point</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Point
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(349,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(127,172)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(127,276)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.y</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.y
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n10" data-id="10" transform="translate(24,294)" style="opacity: 1;"><path class="box" d="M0,0H82V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="41" y="17"><tspan>True</tspan><tspan class="node-id">  #10/0</tspan></text><text class="type" text-anchor="middle" y="35" x="41"/><title>#10 True
-Projection 0 of #0
-Type not computed
-
-</title></g><g class="node" id="n11" data-id="11" transform="translate(431,294)" style="opacity: 1;"><path class="box" d="M0,0H86V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="43" y="17"><tspan>False</tspan><tspan class="node-id">  #11/1</tspan></text><text class="type" text-anchor="middle" y="35" x="43"/><title>#11 False
-Projection 1 of #0
-Type not computed
-
-</title></g><g class="node" id="n12" data-id="12" transform="translate(279,276)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#3</tspan><tspan class="node-id">  #12</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#12 #3
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n13" data-id="13" transform="translate(41,380)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #13</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#13 Store p.x
-Type not computed
-
-[0] → #10 CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → #12 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="#536477"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n14" data-id="14" transform="translate(538,276)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#4</tspan><tspan class="node-id">  #14</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#14 #4
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n15" data-id="15" transform="translate(450,380)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #15</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#15 Store p.x
-Type not computed
-
-[0] → #11 CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → #14 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="#536477"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n17" data-id="17" transform="translate(525,484)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi $mem</tspan><tspan class="node-id">  #17</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#17 Phi $mem
-Type not computed
-
-[0] → — ASSOC
-[1] → #13 MEM
-[2] → #15 MEM</title><circle class="port" cx="0" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="0" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n18" data-id="18" transform="translate(596,588)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Load p.x</tspan><tspan class="node-id">  #18</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#18 Load p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #17 MEM
-[2] → #5 DATA
-[3] → — DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="white"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n19" data-id="19" transform="translate(525,692)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #19</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#19 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #17 MEM
-[2] → #18 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/example2b.gv b/chapter10a/docs/example2b.gv
deleted file mode 100644
index c7d64509..00000000
--- a/chapter10a/docs/example2b.gv
+++ /dev/null
@@ -1,19 +0,0 @@
-digraph Memory {
- // IR styles match graph/web/render.js; arrows are use -> definition.
- graph [bgcolor="#fafbfc" fontname="Helvetica" nodesep=0.35 ranksep=0.55 splines=ortho];
- node [fontname="Helvetica" fontsize=12 color="#758191" fontcolor="#152330" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- edge [fontname="Helvetica" fontsize=9 color="#536477" fontcolor="#364352" arrowsize=0.7 penwidth=1.5];
-
- rankdir=RL;
-
- P [label="Phi(memory)" shape=hexagon style="filled" fillcolor="#f5e4fa"];
- S [label="Loop-body Store" shape=octagon style="filled" fillcolor="#dcecff"];
- P -> Entry [color="#2867b2"];
- P -> S [color="#2867b2",constraint=false]; // Backedge must not place Store before Phi.
- S -> P [color="#2867b2"];
- P -> Loop [style=dashed,color="#9396a3"]; Return -> P [color="#2867b2"];
- Return -> S [style=invis]; // Layout only: Phi, Store, Return from left to right.
- Return [shape=box style="filled" fillcolor="#fff1c4"];
- Entry [shape=octagon style="filled" fillcolor="#dcecff"];
- Loop [shape=box style="rounded,filled" fillcolor="#ffe0ab"];
-}
diff --git a/chapter10a/docs/example2b.json b/chapter10a/docs/example2b.json
deleted file mode 100644
index 0b778aea..00000000
--- a/chapter10a/docs/example2b.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "ver": 1,
- "comp": "chapter10a/docs/example2b.svg",
- "step": 1,
- "roots": [19],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 4, "label": "arg", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "DATA", "label": null}], "proj": {"par": 1, "idx": 2}},
- {"id": 5, "label": "new Point", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.y", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 10, "label": "Phi $mem", "type": null, "kind": "PHI", "edges": [{"idx": 0, "def": 0, "role": "ASSOC", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 15, "role": "MEM", "label": null}], "proj": null},
- {"id": 11, "label": "Phi arg", "type": null, "kind": "PHI", "edges": [{"idx": 0, "def": 0, "role": "ASSOC", "label": null}, {"idx": 1, "def": 4, "role": "DATA", "label": null}, {"idx": 2, "def": 17, "role": "DATA", "label": null}], "proj": null},
- {"id": 13, "label": "True", "type": null, "kind": "CTRL", "edges": [], "proj": {"par": 0, "idx": 0}},
- {"id": 14, "label": "False", "type": null, "kind": "CTRL", "edges": [], "proj": {"par": 0, "idx": 1}},
- {"id": 15, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 13, "role": "CTRL", "label": null}, {"idx": 1, "def": 10, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 11, "role": "DATA", "label": null}], "proj": null},
- {"id": 16, "label": "#1", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 17, "label": "-", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 11, "role": "DATA", "label": null}, {"idx": 2, "def": 16, "role": "DATA", "label": null}], "proj": null},
- {"id": 18, "label": "Load p.x", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 14, "role": "CTRL", "label": null}, {"idx": 1, "def": 10, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 0, "role": "DATA", "label": null}], "proj": null},
- {"id": 19, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 10, "role": "MEM", "label": null}, {"idx": 2, "def": 18, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/example2b.svg b/chapter10a/docs/example2b.svg
deleted file mode 100644
index 1feb91a3..00000000
--- a/chapter10a/docs/example2b.svg
+++ /dev/null
@@ -1,135 +0,0 @@
-<svg aria-label="Compiler graph" width="647" height="664" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 647 664" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M316,46 C316,70 563,41 563,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M133,118 L133,140 Q133,148 141,148 L462,148 Q470,148 470,156 L470,168" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M411,118 L411,130 Q411,138 419,138 L486,138 Q494,138 494,146 L494,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M563,118 L563,140 Q563,148 555,148 L526,148 Q518,148 518,156 L518,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M482,224 L482,229 Q482,234 487,234 L487,234 Q492,234 492,239 L492,272" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M411,118 L411,130 Q411,138 419,138 L544,138 Q552,138 552,146 L552,226 Q552,234 544,234 L524,234 Q516,234 516,242 L516,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M563,118 L563,236 Q563,244 555,244 L548,244 Q540,244 540,252 L540,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #6 · DATA</title></path><path class="edge MEM" id="e10i1" d="M504,328 L504,340 Q504,348 496,348 L385,348 Q377,348 377,356 L377,376" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[1] → #8 · MEM</title></path><path class="edge MEM" id="e10i2" d="M101,536 L101,541 Q101,546 106,546 L459,546 Q467,546 467,538 L467,366 Q467,358 459,358 L425,358 Q417,358 417,366 L417,376" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[2] → #15 · MEM</title></path><path class="edge DATA" id="e11i1" d="M253,118 L253,123 Q253,128 248,128 L178,128 Q170,128 170,136 L170,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#11[1] → #4 · DATA</title></path><path class="edge DATA" id="e11i2" d="M312,328 L312,333 Q312,338 317,338 L404,338 Q412,338 412,330 L412,166 Q412,158 404,158 L215,158 Q210,158 210,163 L210,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#11[2] → #17 · DATA</title></path><path class="edge CTRL" id="e15i0" d="M65,432 L65,480" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#15[0] → #13 · CTRL</title></path><path class="edge MEM" id="e15i1" d="M397,432 L397,437 Q397,442 392,442 L97,442 Q89,442 89,450 L89,480" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#15[1] → #10 · MEM</title></path><path class="edge DATA" id="e15i2" d="M411,118 L411,130 Q411,138 403,138 L124,138 Q116,138 116,146 L116,450.5 Q116,452 114.5,452 L114.5,452 Q113,452 113,453.5 L113,480" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[2] → #5 · DATA</title></path><path class="edge DATA" id="e15i3" d="M190,224 L190,229 Q190,234 185,234 L145,234 Q137,234 137,242 L137,480" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[3] → #11 · DATA</title></path><path class="edge ASSOC" id="e16i0" d="M316,46 C316,70 342,147 342,171" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#16[0] → #1 · ASSOC</title></path><path class="edge DATA" id="e17i1" d="M190,224 L190,229 Q190,234 195,234 L304,234 Q312,234 312,242 L312,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#17[1] → #11 · DATA</title></path><path class="edge DATA" id="e17i2" d="M342,224 L342,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#17[2] → #16 · DATA</title></path><path class="edge CTRL" id="e18i0" d="M521,432 L521,480" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#18[0] → #14 · CTRL</title></path><path class="edge MEM" id="e18i1" d="M397,432 L397,437 Q397,442 402,442 L537,442 Q545,442 545,450 L545,480" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#18[1] → #10 · MEM</title></path><path class="edge DATA" id="e18i2" d="M411,118 L411,130 Q411,138 419,138 L566,138 Q574,138 574,146 L574,439.5 Q574,442 571.5,442 L571.5,442 Q569,442 569,444.5 L569,480" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#18[2] → #5 · DATA</title></path><path class="edge MEM" id="e19i1" d="M397,432 L397,437 Q397,442 402,442 L469,442 Q477,442 477,450 L477,584" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#19[1] → #10 · MEM</title></path><path class="edge DATA" id="e19i2" d="M557,536 L557,541 Q557,546 552,546 L515,546 Q507,546 507,554 L507,584" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#19[2] → #18 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(73,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="120"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(73,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n4" data-id="4" transform="translate(193,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#4 arg
-Projection 2 of #1
-Type not computed
-
-[0] → #1 DATA</title></g><g class="node" id="n5" data-id="5" transform="translate(351,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Point</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Point
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(503,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(422,174)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(444,278)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.y</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.y
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n10" data-id="10" transform="translate(337,382)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi $mem</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#10 Phi $mem
-Type not computed
-
-[0] → — ASSOC
-[1] → #8 MEM
-[2] → #15 MEM</title><circle class="port" cx="0" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="0" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n11" data-id="11" transform="translate(130,174)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi arg</tspan><tspan class="node-id">  #11</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#11 Phi arg
-Type not computed
-
-[0] → — ASSOC
-[1] → #4 DATA
-[2] → #17 DATA</title><circle class="port" cx="0" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="0" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n13" data-id="13" transform="translate(24,400)" style="opacity: 1;"><path class="box" d="M0,0H82V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="41" y="17"><tspan>True</tspan><tspan class="node-id">  #13/0</tspan></text><text class="type" text-anchor="middle" y="35" x="41"/><title>#13 True
-Projection 0 of #0
-Type not computed
-
-</title></g><g class="node" id="n14" data-id="14" transform="translate(477,400)" style="opacity: 1;"><path class="box" d="M0,0H87V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="43.5" y="17"><tspan>False</tspan><tspan class="node-id">  #14/1</tspan></text><text class="type" text-anchor="middle" y="35" x="43.5"/><title>#14 False
-Projection 1 of #0
-Type not computed
-
-</title></g><g class="node" id="n15" data-id="15" transform="translate(41,486)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #15</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#15 Store p.x
-Type not computed
-
-[0] → #13 CTRL
-[1] → #10 MEM
-[2] → #5 DATA
-[3] → #11 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="#536477"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n16" data-id="16" transform="translate(282,174)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#1</tspan><tspan class="node-id">  #16</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#16 #1
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n17" data-id="17" transform="translate(252,278)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>-</tspan><tspan class="node-id">  #17</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#17 -
-Type not computed
-
-[0] → — CTRL
-[1] → #11 DATA
-[2] → #16 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n18" data-id="18" transform="translate(497,486)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Load p.x</tspan><tspan class="node-id">  #18</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#18 Load p.x
-Type not computed
-
-[0] → #14 CTRL
-[1] → #10 MEM
-[2] → #5 DATA
-[3] → — DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="#536477"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="white"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n19" data-id="19" transform="translate(417,590)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #19</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#19 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #10 MEM
-[2] → #18 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/example2c.gv b/chapter10a/docs/example2c.gv
deleted file mode 100644
index f3a52b4d..00000000
--- a/chapter10a/docs/example2c.gv
+++ /dev/null
@@ -1,14 +0,0 @@
-digraph Memory {
- // IR styles match graph/web/render.js; arrows are use -> definition.
- graph [bgcolor="#fafbfc" fontname="Helvetica" nodesep=0.35 ranksep=0.55 splines=ortho];
- node [fontname="Helvetica" fontsize=12 color="#758191" fontcolor="#152330" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- edge [fontname="Helvetica" fontsize=9 color="#536477" fontcolor="#364352" arrowsize=0.7 penwidth=1.5];
-
- rankdir=RL;
-
- M [label="Prior memory" shape=octagon style="filled" fillcolor="#dcecff"];
- L [label="Load p.x" shape=box style="rounded,filled" fillcolor="#edf3f7"];
- S [label="Store p.x" shape=octagon style="filled" fillcolor="#dcecff"];
- L -> M [color="#2867b2"]; S -> M [color="#2867b2"];
- S -> L [style=dashed,xlabel="execute load first"];
-}
diff --git a/chapter10a/docs/example2c.json b/chapter10a/docs/example2c.json
deleted file mode 100644
index 84c3d2b6..00000000
--- a/chapter10a/docs/example2c.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "ver": 1,
- "comp": "chapter10a/docs/example2c.svg",
- "step": 1,
- "roots": [11],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 4, "label": "arg", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "DATA", "label": null}], "proj": {"par": 1, "idx": 2}},
- {"id": 5, "label": "new Point", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.y", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 9, "label": "Load p.x", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 0, "role": "DATA", "label": null}], "proj": null},
- {"id": 10, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 4, "role": "DATA", "label": null}], "proj": null},
- {"id": 11, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 10, "role": "MEM", "label": null}, {"idx": 2, "def": 9, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/example2c.svg b/chapter10a/docs/example2c.svg
deleted file mode 100644
index f7f7bce3..00000000
--- a/chapter10a/docs/example2c.svg
+++ /dev/null
@@ -1,109 +0,0 @@
-<svg aria-label="Compiler graph" width="598" height="560" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 598 560" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M419,46 C419,70 514,41 514,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M236,118 L236,123 Q236,128 231,128 L151,128 Q143,128 143,136 L143,168" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M84,118 L84,150 Q84,158 92,158 L162,158 Q167,158 167,163 L167,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M514,118 L514,130 Q514,138 506,138 L199,138 Q191,138 191,146 L191,168" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M155,224 L155,229 Q155,234 160,234 L193,234 Q201,234 201,242 L201,272" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M84,118 L84,150 Q84,158 92,158 L217,158 Q225,158 225,166 L225,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M514,118 L514,130 Q514,138 506,138 L257,138 Q249,138 249,146 L249,272" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #6 · DATA</title></path><path class="edge MEM" id="e9i1" d="M213,328 L213,333 Q213,338 218,338 L262,338 Q270,338 270,346 L270,376" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#9[1] → #8 · MEM</title></path><path class="edge DATA" id="e9i2" d="M84,118 L84,150 Q84,158 92,158 L286,158 Q294,158 294,166 L294,376" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#9[2] → #5 · DATA</title></path><path class="edge MEM" id="e10i1" d="M213,328 L213,333 Q213,338 208,338 L126,338 Q118,338 118,346 L118,376" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[1] → #8 · MEM</title></path><path class="edge DATA" id="e10i2" d="M84,118 L84,340 Q84,348 92,348 L134,348 Q142,348 142,356 L142,376" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[2] → #5 · DATA</title></path><path class="edge DATA" id="e10i3" d="M356,118 L356,140 Q356,148 348,148 L291,148 Q283,148 283,156 L283,340 Q283,348 275,348 L174,348 Q166,348 166,356 L166,376" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[3] → #4 · DATA</title></path><path class="edge MEM" id="e11i1" d="M130,432 L130,480" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#11[1] → #10 · MEM</title></path><path class="edge DATA" id="e11i2" d="M282,432 L282,437 Q282,442 277,442 L168,442 Q160,442 160,450 L160,480" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#11[2] → #9 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(176,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="120"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(176,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n4" data-id="4" transform="translate(296,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#4 arg
-Projection 2 of #1
-Type not computed
-
-[0] → #1 DATA</title></g><g class="node" id="n5" data-id="5" transform="translate(24,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Point</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Point
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(454,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(95,174)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(153,278)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.y</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.y
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n9" data-id="9" transform="translate(222,382)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Load p.x</tspan><tspan class="node-id">  #9</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#9 Load p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → — DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="white"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n10" data-id="10" transform="translate(70,382)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#10 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → #4 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n11" data-id="11" transform="translate(70,486)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #11</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#11 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #10 MEM
-[2] → #9 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/lattice.gv b/chapter10a/docs/lattice.gv
deleted file mode 100644
index b56a3073..00000000
--- a/chapter10a/docs/lattice.gv
+++ /dev/null
@@ -1,127 +0,0 @@
-digraph Lattice {
- rankdir=TB;
- newrank=true;
- // Preserve the same-rank ordering edges through cluster layout.
- remincross=false;
- nodesep=0.22;
- ranksep=0.65;
- node [shape=ellipse, style=filled, fontname="DejaVu Sans", fontsize=13];
- edge [color="#555555", arrowsize=0.6];
-
- // These arrows are lattice-order edges, not use/definition edges.
- TOP [label="⊤", fillcolor=black, fontcolor=white];
- BOT [label="⊥", fillcolor=black, fontcolor=white];
-
- subgraph cluster_control {
- label="Control"; fontname="Arial"; color="#cccccc";
- node [fillcolor="#ffff00"];
- XCTRL [label="⊤:ctrl"];
- CTRL [label="⊥:ctrl"];
- XCTRL -> CTRL;
- }
-
- subgraph cluster_integer {
- label="Integer"; fontname="Arial"; color="#cccccc";
- node [fillcolor="#add8e6"];
- INT_TOP [label="⊤:int"];
- INT_BOT [label="⊥:int"];
- INT_NEG [label="… −2, −1"];
- INT_ZERO [label="0"];
- INT_POS [label="1, 2, …"];
- {rank=same; INT_NEG; INT_ZERO; INT_POS;}
- INT_NEG -> INT_ZERO -> INT_POS [style=invis];
- INT_TOP -> {INT_NEG INT_ZERO INT_POS};
- {INT_NEG INT_ZERO INT_POS} -> INT_BOT;
- }
-
- subgraph cluster_pointer {
- label="Pointer = nullability × struct type";
- fontname="Arial"; color="#cccccc";
- node [fillcolor="#008000", fontcolor=white];
- PTR_TOP [label="⊤:ptr\n[*⊤:struct]"];
- PTR_BOT [label="⊥:ptr\n[*⊥:struct?]"];
- PTR_NULL [label="null"];
- PTR_ANY [label="*⊥:struct\n[ptr any struct]"];
- PTR_PERSON [label="*Person"];
- PTR_S1 [label="*s1"];
- PTR_MORE [label="*s2, …"];
- PTR_PERSON_NIL [label="*Person?"];
- PTR_S1_NIL [label="*s1?"];
- PTR_MORE_NIL [label="*s2?, …"];
- {rank=same; PTR_PERSON; PTR_S1; PTR_MORE; PTR_NULL;}
- {rank=same; PTR_ANY; PTR_PERSON_NIL; PTR_S1_NIL; PTR_MORE_NIL;}
- PTR_PERSON -> PTR_S1 -> PTR_MORE -> PTR_NULL [style=invis];
- PTR_ANY -> PTR_PERSON_NIL -> PTR_S1_NIL -> PTR_MORE_NIL [style=invis];
- PTR_TOP -> {PTR_PERSON PTR_S1 PTR_MORE PTR_NULL};
- {PTR_PERSON PTR_S1 PTR_MORE} -> PTR_ANY;
- PTR_PERSON -> PTR_PERSON_NIL;
- PTR_S1 -> PTR_S1_NIL;
- PTR_MORE -> PTR_MORE_NIL;
- PTR_NULL -> {PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL};
- {PTR_ANY PTR_PERSON_NIL PTR_S1_NIL PTR_MORE_NIL} -> PTR_BOT;
- }
-
- subgraph cluster_struct {
- label="Struct\nnamed collection of named scalar types";
- fontname="Arial"; color="#cccccc";
- node [fillcolor="#90ee90"];
- STRUCT_TOP [label="⊤:struct\n[struct top]"];
- STRUCT_BOT [label="⊥:struct\n[struct bottom]"];
- STRUCT_PERSON [label="Person\nage: int", shape=box];
- STRUCT_S1 [label="s1\nx: int", shape=box];
- STRUCT_S2 [label="s2\nx: int, y: int", shape=box];
- STRUCT_MORE [label="…", shape=box];
- {rank=same; STRUCT_PERSON; STRUCT_S1; STRUCT_S2; STRUCT_MORE;}
- STRUCT_PERSON -> STRUCT_S1 -> STRUCT_S2 -> STRUCT_MORE [style=invis];
- STRUCT_TOP -> {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE};
- {STRUCT_PERSON STRUCT_S1 STRUCT_S2 STRUCT_MORE} -> STRUCT_BOT;
- }
-
- subgraph cluster_memory {
- label="Memory"; fontname="Arial"; color="#cccccc";
- node [fillcolor="#00008b", fontcolor=white];
- MEM_TOP [label="⊤:mem"];
- MEM_BOT [label="⊥:mem"];
- MEM_TOP -> MEM_BOT;
- }
-
- subgraph cluster_tuple {
- label="Tuple\ncollection of types";
- fontname="Arial"; color="#cccccc";
- node [fillcolor="#ffc0cb"];
- TUPLE_TOP [label="⊤:tuple"];
- TUPLE_BOT [label="⊥:tuple"];
- // Each black element stands for a recursively nested type lattice.
- TUPLE1 [shape=plain, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
- <TR><TD BGCOLOR="#ffc0cb">tuple</TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLE2 [shape=plain, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
- <TR><TD BGCOLOR="#ffc0cb">tuple</TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">type</FONT></TD></TR>
- </TABLE>
- >];
- TUPLEN [shape=plain, label=<
- <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4">
- <TR><TD BGCOLOR="#ffc0cb">tuple</TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">type</FONT></TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">…</FONT></TD></TR>
- <TR><TD BGCOLOR="black"><FONT COLOR="white">type</FONT></TD></TR>
- </TABLE>
- >];
- {rank=same; TUPLE1; TUPLE2; TUPLEN;}
- TUPLE1 -> TUPLE2 -> TUPLEN [style=invis];
- TUPLE_TOP -> {TUPLE1 TUPLE2 TUPLEN};
- {TUPLE1 TUPLE2 TUPLEN} -> TUPLE_BOT;
- }
-
- TOP -> {XCTRL INT_TOP PTR_TOP STRUCT_TOP MEM_TOP TUPLE_TOP};
- {CTRL INT_BOT PTR_BOT STRUCT_BOT MEM_BOT TUPLE_BOT} -> BOT;
- {rank=same; XCTRL; INT_TOP; PTR_TOP; STRUCT_TOP; MEM_TOP; TUPLE_TOP;}
- {rank=same; CTRL; INT_BOT; PTR_BOT; STRUCT_BOT; MEM_BOT; TUPLE_BOT;}
- XCTRL -> INT_TOP -> PTR_TOP -> STRUCT_TOP -> MEM_TOP -> TUPLE_TOP [style=invis];
-}
diff --git a/chapter10a/docs/lattice.svg b/chapter10a/docs/lattice.svg
deleted file mode 100644
index 006ab762..00000000
--- a/chapter10a/docs/lattice.svg
+++ /dev/null
@@ -1,593 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
- "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<!-- Generated by graphviz version 12.2.0 (20241103.1931)
- -->
-<!-- Title: Lattice Pages: 1 -->
-<svg width="1551pt" height="603pt"
- viewBox="0.00 0.00 1551.00 603.45" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 599.45)">
-<title>Lattice</title>
-<polygon fill="white" stroke="none" points="-4,4 -4,-599.45 1547,-599.45 1547,4 -4,4"/>
-<g id="clust1" class="cluster">
-<title>cluster_control</title>
-<polygon fill="none" stroke="#cccccc" points="8,-85.99 8,-524.71 98,-524.71 98,-85.99 8,-85.99"/>
-<text text-anchor="middle" x="53" y="-507.41" font-family="Arial" font-size="14.00">Control</text>
-</g>
-<g id="clust2" class="cluster">
-<title>cluster_integer</title>
-<polygon fill="none" stroke="#cccccc" points="106,-85.99 106,-524.71 404,-524.71 404,-85.99 106,-85.99"/>
-<text text-anchor="middle" x="255" y="-507.41" font-family="Arial" font-size="14.00">Integer</text>
-</g>
-<g id="clust6" class="cluster">
-<title>cluster_pointer</title>
-<polygon fill="none" stroke="#cccccc" points="412,-75 412,-535.7 893,-535.7 893,-75 412,-75"/>
-<text text-anchor="middle" x="652.5" y="-518.4" font-family="Arial" font-size="14.00">Pointer = nullability × struct type</text>
-</g>
-<g id="clust13" class="cluster">
-<title>cluster_struct</title>
-<polygon fill="none" stroke="#cccccc" points="901,-75 901,-551.45 1233,-551.45 1233,-75 901,-75"/>
-<text text-anchor="middle" x="1067" y="-534.15" font-family="Arial" font-size="14.00">Struct</text>
-<text text-anchor="middle" x="1067" y="-518.4" font-family="Arial" font-size="14.00">named collection of named scalar types</text>
-</g>
-<g id="clust17" class="cluster">
-<title>cluster_memory</title>
-<polygon fill="none" stroke="#cccccc" points="1241,-85.99 1241,-524.71 1347,-524.71 1347,-85.99 1241,-85.99"/>
-<text text-anchor="middle" x="1294" y="-507.41" font-family="Arial" font-size="14.00">Memory</text>
-</g>
-<g id="clust18" class="cluster">
-<title>cluster_tuple</title>
-<polygon fill="none" stroke="#cccccc" points="1355,-85.99 1355,-540.46 1535,-540.46 1535,-85.99 1355,-85.99"/>
-<text text-anchor="middle" x="1445" y="-523.16" font-family="Arial" font-size="14.00">Tuple</text>
-<text text-anchor="middle" x="1445" y="-507.41" font-family="Arial" font-size="14.00">collection of types</text>
-</g>
-<!-- TOP -->
-<g id="node1" class="node">
-<title>TOP</title>
-<ellipse fill="black" stroke="black" cx="875" cy="-577.45" rx="27" ry="18"/>
-<text text-anchor="middle" x="875" y="-573.35" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤</text>
-</g>
-<!-- XCTRL -->
-<g id="node3" class="node">
-<title>XCTRL</title>
-<ellipse fill="#ffff00" stroke="black" cx="53" cy="-474.96" rx="36.51" ry="18"/>
-<text text-anchor="middle" x="53" y="-470.86" font-family="DejaVu Sans" font-size="13.00">⊤:ctrl</text>
-</g>
-<!-- TOP&#45;&gt;XCTRL -->
-<g id="edge53" class="edge">
-<title>TOP&#45;&gt;XCTRL</title>
-<path fill="none" stroke="#555555" d="M847.89,-576.27C714.74,-575.32 135.11,-570.13 102,-551.45 82.18,-540.26 69.05,-517.37 61.41,-499.71"/>
-<polygon fill="#555555" stroke="#555555" points="63.45,-499.15 59.24,-494.39 59.57,-500.74 63.45,-499.15"/>
-</g>
-<!-- INT_TOP -->
-<g id="node5" class="node">
-<title>INT_TOP</title>
-<ellipse fill="#add8e6" stroke="black" cx="353" cy="-474.96" rx="33.44" ry="18"/>
-<text text-anchor="middle" x="353" y="-470.86" font-family="DejaVu Sans" font-size="13.00">⊤:int</text>
-</g>
-<!-- TOP&#45;&gt;INT_TOP -->
-<g id="edge54" class="edge">
-<title>TOP&#45;&gt;INT_TOP</title>
-<path fill="none" stroke="#555555" d="M847.84,-576.34C753.92,-575.8 446.62,-572.41 408,-551.45 387.24,-540.18 372.3,-517.29 363.27,-499.66"/>
-<polygon fill="#555555" stroke="#555555" points="365.18,-498.78 360.66,-494.31 361.41,-500.63 365.18,-498.78"/>
-</g>
-<!-- PTR_TOP -->
-<g id="node10" class="node">
-<title>PTR_TOP</title>
-<ellipse fill="#008000" stroke="black" cx="715" cy="-474.96" rx="61.7" ry="28.99"/>
-<text text-anchor="middle" x="715" y="-479.11" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:ptr</text>
-<text text-anchor="middle" x="715" y="-462.61" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊤:struct]</text>
-</g>
-<!-- TOP&#45;&gt;PTR_TOP -->
-<g id="edge55" class="edge">
-<title>TOP&#45;&gt;PTR_TOP</title>
-<path fill="none" stroke="#555555" d="M855.7,-564.33C831.54,-549.16 789.48,-522.73 757.62,-502.72"/>
-<polygon fill="#555555" stroke="#555555" points="758.87,-501.03 752.67,-499.62 756.64,-504.59 758.87,-501.03"/>
-</g>
-<!-- STRUCT_TOP -->
-<g id="node20" class="node">
-<title>STRUCT_TOP</title>
-<ellipse fill="#90ee90" stroke="black" cx="996" cy="-474.96" rx="64.35" ry="28.99"/>
-<text text-anchor="middle" x="996" y="-479.11" font-family="DejaVu Sans" font-size="13.00">⊤:struct</text>
-<text text-anchor="middle" x="996" y="-462.61" font-family="DejaVu Sans" font-size="13.00">[struct top]</text>
-</g>
-<!-- TOP&#45;&gt;STRUCT_TOP -->
-<g id="edge56" class="edge">
-<title>TOP&#45;&gt;STRUCT_TOP</title>
-<path fill="none" stroke="#555555" d="M891.32,-562.9C908.92,-548.28 937.5,-524.55 960.35,-505.57"/>
-<polygon fill="#555555" stroke="#555555" points="961.58,-507.27 964.86,-501.82 958.9,-504.04 961.58,-507.27"/>
-</g>
-<!-- MEM_TOP -->
-<g id="node26" class="node">
-<title>MEM_TOP</title>
-<ellipse fill="#00008b" stroke="black" cx="1294" cy="-474.96" rx="44.7" ry="18"/>
-<text text-anchor="middle" x="1294" y="-470.86" font-family="DejaVu Sans" font-size="13.00" fill="white">⊤:mem</text>
-</g>
-<!-- TOP&#45;&gt;MEM_TOP -->
-<g id="edge57" class="edge">
-<title>TOP&#45;&gt;MEM_TOP</title>
-<path fill="none" stroke="#555555" d="M902.2,-575.86C981.35,-573.98 1207.82,-567.26 1237,-551.45 1258.22,-539.95 1273.86,-516.78 1283.33,-499.12"/>
-<polygon fill="#555555" stroke="#555555" points="1284.97,-500.54 1285.85,-494.24 1281.23,-498.61 1284.97,-500.54"/>
-</g>
-<!-- TUPLE_TOP -->
-<g id="node28" class="node">
-<title>TUPLE_TOP</title>
-<ellipse fill="#ffc0cb" stroke="black" cx="1408" cy="-474.96" rx="44.7" ry="18"/>
-<text text-anchor="middle" x="1408" y="-470.86" font-family="DejaVu Sans" font-size="13.00">⊤:tuple</text>
-</g>
-<!-- TOP&#45;&gt;TUPLE_TOP -->
-<g id="edge58" class="edge">
-<title>TOP&#45;&gt;TUPLE_TOP</title>
-<path fill="none" stroke="#555555" d="M902.34,-576.35C997.63,-575.82 1311.4,-572.48 1351,-551.45 1372.31,-540.13 1387.94,-516.93 1397.39,-499.22"/>
-<polygon fill="#555555" stroke="#555555" points="1399.03,-500.62 1399.89,-494.32 1395.29,-498.7 1399.03,-500.62"/>
-</g>
-<!-- BOT -->
-<g id="node2" class="node">
-<title>BOT</title>
-<ellipse fill="black" stroke="black" cx="884" cy="-18" rx="27" ry="18"/>
-<text text-anchor="middle" x="884" y="-13.9" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥</text>
-</g>
-<!-- CTRL -->
-<g id="node4" class="node">
-<title>CTRL</title>
-<ellipse fill="#ffff00" stroke="black" cx="53" cy="-111.99" rx="36.51" ry="18"/>
-<text text-anchor="middle" x="53" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:ctrl</text>
-</g>
-<!-- XCTRL&#45;&gt;CTRL -->
-<g id="edge1" class="edge">
-<title>XCTRL&#45;&gt;CTRL</title>
-<path fill="none" stroke="#555555" d="M53,-456.55C53,-397.7 53,-206.04 53,-137.58"/>
-<polygon fill="#555555" stroke="#555555" points="55.1,-137.74 53,-131.74 50.9,-137.74 55.1,-137.74"/>
-</g>
-<!-- XCTRL&#45;&gt;INT_TOP -->
-<!-- CTRL&#45;&gt;BOT -->
-<g id="edge59" class="edge">
-<title>CTRL&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M69.29,-95.39C78.22,-87.83 89.91,-79.45 102,-75 242.26,-23.4 717.31,-19.12 849.57,-18.95"/>
-<polygon fill="#555555" stroke="#555555" points="849.19,-21.05 855.19,-18.94 849.18,-16.85 849.19,-21.05"/>
-</g>
-<!-- INT_NEG -->
-<g id="node7" class="node">
-<title>INT_NEG</title>
-<ellipse fill="#add8e6" stroke="black" cx="169" cy="-216.97" rx="55.45" ry="18"/>
-<text text-anchor="middle" x="169" y="-212.87" font-family="DejaVu Sans" font-size="13.00">… −2, −1</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_NEG -->
-<g id="edge4" class="edge">
-<title>INT_TOP&#45;&gt;INT_NEG</title>
-<path fill="none" stroke="#555555" d="M338.42,-458.38C324.81,-443.56 304.22,-420.4 288,-398.97 246.77,-344.48 204.12,-276.17 182.84,-241.1"/>
-<polygon fill="#555555" stroke="#555555" points="184.8,-240.29 179.9,-236.24 181.21,-242.46 184.8,-240.29"/>
-</g>
-<!-- INT_ZERO -->
-<g id="node8" class="node">
-<title>INT_ZERO</title>
-<ellipse fill="#add8e6" stroke="black" cx="267" cy="-216.97" rx="27" ry="18"/>
-<text text-anchor="middle" x="267" y="-212.87" font-family="DejaVu Sans" font-size="13.00">0</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_ZERO -->
-<g id="edge5" class="edge">
-<title>INT_TOP&#45;&gt;INT_ZERO</title>
-<path fill="none" stroke="#555555" d="M347.22,-456.76C332.26,-412.21 292.18,-292.93 275,-241.79"/>
-<polygon fill="#555555" stroke="#555555" points="277.02,-241.21 273.12,-236.19 273.04,-242.55 277.02,-241.21"/>
-</g>
-<!-- INT_POS -->
-<g id="node9" class="node">
-<title>INT_POS</title>
-<ellipse fill="#add8e6" stroke="black" cx="353" cy="-216.97" rx="43.16" ry="18"/>
-<text text-anchor="middle" x="353" y="-212.87" font-family="DejaVu Sans" font-size="13.00">1, 2, …</text>
-</g>
-<!-- INT_TOP&#45;&gt;INT_POS -->
-<g id="edge6" class="edge">
-<title>INT_TOP&#45;&gt;INT_POS</title>
-<path fill="none" stroke="#555555" d="M353,-456.76C353,-412.51 353,-294.56 353,-242.85"/>
-<polygon fill="#555555" stroke="#555555" points="355.1,-242.94 353,-236.94 350.9,-242.94 355.1,-242.94"/>
-</g>
-<!-- INT_TOP&#45;&gt;PTR_TOP -->
-<!-- INT_BOT -->
-<g id="node6" class="node">
-<title>INT_BOT</title>
-<ellipse fill="#add8e6" stroke="black" cx="310" cy="-111.99" rx="33.44" ry="18"/>
-<text text-anchor="middle" x="310" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:int</text>
-</g>
-<!-- INT_BOT&#45;&gt;BOT -->
-<g id="edge60" class="edge">
-<title>INT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M335.28,-99.84C354.78,-91.7 382.61,-81.07 408,-75 570.29,-36.22 770.4,-23.83 849.5,-20.29"/>
-<polygon fill="#555555" stroke="#555555" points="849.36,-22.39 855.26,-20.04 849.17,-18.2 849.36,-22.39"/>
-</g>
-<!-- INT_NEG&#45;&gt;INT_BOT -->
-<g id="edge7" class="edge">
-<title>INT_NEG&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="#555555" d="M190.72,-200.11C216.15,-181.54 258.17,-150.85 284.95,-131.29"/>
-<polygon fill="#555555" stroke="#555555" points="285.92,-133.18 289.52,-127.95 283.44,-129.79 285.92,-133.18"/>
-</g>
-<!-- INT_NEG&#45;&gt;INT_ZERO -->
-<!-- INT_ZERO&#45;&gt;INT_BOT -->
-<g id="edge8" class="edge">
-<title>INT_ZERO&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="#555555" d="M273.91,-199.43C281.01,-182.41 292.14,-155.76 300.16,-136.55"/>
-<polygon fill="#555555" stroke="#555555" points="302.01,-137.58 302.38,-131.24 298.13,-135.96 302.01,-137.58"/>
-</g>
-<!-- INT_ZERO&#45;&gt;INT_POS -->
-<!-- INT_POS&#45;&gt;INT_BOT -->
-<g id="edge9" class="edge">
-<title>INT_POS&#45;&gt;INT_BOT</title>
-<path fill="none" stroke="#555555" d="M345.9,-198.97C338.83,-182.05 327.93,-155.94 319.99,-136.93"/>
-<polygon fill="#555555" stroke="#555555" points="321.94,-136.15 317.69,-131.42 318.07,-137.76 321.94,-136.15"/>
-</g>
-<!-- PTR_NULL -->
-<g id="node12" class="node">
-<title>PTR_NULL</title>
-<ellipse fill="#008000" stroke="black" cx="799" cy="-345.97" rx="27.3" ry="18"/>
-<text text-anchor="middle" x="799" y="-341.87" font-family="DejaVu Sans" font-size="13.00" fill="white">null</text>
-</g>
-<!-- PTR_TOP&#45;&gt;PTR_NULL -->
-<g id="edge16" class="edge">
-<title>PTR_TOP&#45;&gt;PTR_NULL</title>
-<path fill="none" stroke="#555555" d="M732.81,-447.03C748.16,-423.83 770.03,-390.77 784.37,-369.09"/>
-<polygon fill="#555555" stroke="#555555" points="785.98,-370.45 787.54,-364.29 782.48,-368.13 785.98,-370.45"/>
-</g>
-<!-- PTR_PERSON -->
-<g id="node14" class="node">
-<title>PTR_PERSON</title>
-<ellipse fill="#008000" stroke="black" cx="542" cy="-345.97" rx="45.72" ry="18"/>
-<text text-anchor="middle" x="542" y="-341.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person</text>
-</g>
-<!-- PTR_TOP&#45;&gt;PTR_PERSON -->
-<g id="edge17" class="edge">
-<title>PTR_TOP&#45;&gt;PTR_PERSON</title>
-<path fill="none" stroke="#555555" d="M675.88,-452.05C651.99,-438.01 621.28,-418.77 596,-398.97 584.24,-389.76 572.18,-378.36 562.44,-368.58"/>
-<polygon fill="#555555" stroke="#555555" points="564.05,-367.22 558.35,-364.42 561.06,-370.17 564.05,-367.22"/>
-</g>
-<!-- PTR_S1 -->
-<g id="node15" class="node">
-<title>PTR_S1</title>
-<ellipse fill="#008000" stroke="black" cx="631" cy="-345.97" rx="27" ry="18"/>
-<text text-anchor="middle" x="631" y="-341.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1</text>
-</g>
-<!-- PTR_TOP&#45;&gt;PTR_S1 -->
-<g id="edge18" class="edge">
-<title>PTR_TOP&#45;&gt;PTR_S1</title>
-<path fill="none" stroke="#555555" d="M697.19,-447.03C681.84,-423.83 659.97,-390.77 645.63,-369.09"/>
-<polygon fill="#555555" stroke="#555555" points="647.52,-368.13 642.46,-364.29 644.02,-370.45 647.52,-368.13"/>
-</g>
-<!-- PTR_MORE -->
-<g id="node16" class="node">
-<title>PTR_MORE</title>
-<ellipse fill="#008000" stroke="black" cx="715" cy="-345.97" rx="40.6" ry="18"/>
-<text text-anchor="middle" x="715" y="-341.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2, …</text>
-</g>
-<!-- PTR_TOP&#45;&gt;PTR_MORE -->
-<g id="edge19" class="edge">
-<title>PTR_TOP&#45;&gt;PTR_MORE</title>
-<path fill="none" stroke="#555555" d="M715,-445.77C715,-423.52 715,-392.77 715,-371.51"/>
-<polygon fill="#555555" stroke="#555555" points="717.1,-371.66 715,-365.66 712.9,-371.66 717.1,-371.66"/>
-</g>
-<!-- PTR_TOP&#45;&gt;STRUCT_TOP -->
-<!-- PTR_BOT -->
-<g id="node11" class="node">
-<title>PTR_BOT</title>
-<ellipse fill="#008000" stroke="black" cx="748" cy="-111.99" rx="66.47" ry="28.99"/>
-<text text-anchor="middle" x="748" y="-116.14" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:ptr</text>
-<text text-anchor="middle" x="748" y="-99.64" font-family="DejaVu Sans" font-size="13.00" fill="white">[*⊥:struct?]</text>
-</g>
-<!-- PTR_BOT&#45;&gt;BOT -->
-<g id="edge61" class="edge">
-<title>PTR_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M783.38,-87.06C807.3,-70.88 838.29,-49.92 859.52,-35.56"/>
-<polygon fill="#555555" stroke="#555555" points="860.46,-37.46 864.25,-32.36 858.1,-33.98 860.46,-37.46"/>
-</g>
-<!-- PTR_PERSON_NIL -->
-<g id="node17" class="node">
-<title>PTR_PERSON_NIL</title>
-<ellipse fill="#008000" stroke="black" cx="651" cy="-216.97" rx="50.33" ry="18"/>
-<text text-anchor="middle" x="651" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*Person?</text>
-</g>
-<!-- PTR_NULL&#45;&gt;PTR_PERSON_NIL -->
-<g id="edge26" class="edge">
-<title>PTR_NULL&#45;&gt;PTR_PERSON_NIL</title>
-<path fill="none" stroke="#555555" d="M790.34,-328.75C783.99,-317.83 774.65,-303.55 764,-292.97 740.64,-269.76 709.08,-249.53 685.25,-235.95"/>
-<polygon fill="#555555" stroke="#555555" points="686.33,-234.14 680.07,-233.04 684.27,-237.8 686.33,-234.14"/>
-</g>
-<!-- PTR_S1_NIL -->
-<g id="node18" class="node">
-<title>PTR_S1_NIL</title>
-<ellipse fill="#008000" stroke="black" cx="748" cy="-216.97" rx="30.37" ry="18"/>
-<text text-anchor="middle" x="748" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s1?</text>
-</g>
-<!-- PTR_NULL&#45;&gt;PTR_S1_NIL -->
-<g id="edge27" class="edge">
-<title>PTR_NULL&#45;&gt;PTR_S1_NIL</title>
-<path fill="none" stroke="#555555" d="M792.23,-328.1C783.31,-305.9 767.59,-266.75 757.49,-241.6"/>
-<polygon fill="#555555" stroke="#555555" points="759.55,-241.1 755.36,-236.31 755.65,-242.66 759.55,-241.1"/>
-</g>
-<!-- PTR_MORE_NIL -->
-<g id="node19" class="node">
-<title>PTR_MORE_NIL</title>
-<ellipse fill="#008000" stroke="black" cx="840" cy="-216.97" rx="45.21" ry="18"/>
-<text text-anchor="middle" x="840" y="-212.87" font-family="DejaVu Sans" font-size="13.00" fill="white">*s2?, …</text>
-</g>
-<!-- PTR_NULL&#45;&gt;PTR_MORE_NIL -->
-<g id="edge28" class="edge">
-<title>PTR_NULL&#45;&gt;PTR_MORE_NIL</title>
-<path fill="none" stroke="#555555" d="M804.53,-327.84C811.65,-305.78 824.07,-267.3 832.17,-242.24"/>
-<polygon fill="#555555" stroke="#555555" points="834.12,-243.03 833.96,-236.68 830.12,-241.74 834.12,-243.03"/>
-</g>
-<!-- PTR_ANY -->
-<g id="node13" class="node">
-<title>PTR_ANY</title>
-<ellipse fill="#008000" stroke="black" cx="502" cy="-216.97" rx="82.38" ry="28.99"/>
-<text text-anchor="middle" x="502" y="-221.12" font-family="DejaVu Sans" font-size="13.00" fill="white">*⊥:struct</text>
-<text text-anchor="middle" x="502" y="-204.62" font-family="DejaVu Sans" font-size="13.00" fill="white">[ptr any struct]</text>
-</g>
-<!-- PTR_ANY&#45;&gt;PTR_BOT -->
-<g id="edge29" class="edge">
-<title>PTR_ANY&#45;&gt;PTR_BOT</title>
-<path fill="none" stroke="#555555" d="M554.17,-194.13C595.32,-176.91 652.51,-152.97 694.1,-135.56"/>
-<polygon fill="#555555" stroke="#555555" points="694.78,-137.55 699.5,-133.29 693.15,-133.67 694.78,-137.55"/>
-</g>
-<!-- PTR_ANY&#45;&gt;PTR_PERSON_NIL -->
-<!-- PTR_PERSON&#45;&gt;PTR_ANY -->
-<g id="edge20" class="edge">
-<title>PTR_PERSON&#45;&gt;PTR_ANY</title>
-<path fill="none" stroke="#555555" d="M536.61,-327.84C530.59,-308.74 520.69,-277.32 513.02,-252.97"/>
-<polygon fill="#555555" stroke="#555555" points="515.08,-252.52 511.28,-247.43 511.08,-253.78 515.08,-252.52"/>
-</g>
-<!-- PTR_PERSON&#45;&gt;PTR_S1 -->
-<!-- PTR_PERSON&#45;&gt;PTR_PERSON_NIL -->
-<g id="edge23" class="edge">
-<title>PTR_PERSON&#45;&gt;PTR_PERSON_NIL</title>
-<path fill="none" stroke="#555555" d="M556.03,-328.62C575.38,-306.08 610.32,-265.36 632,-240.11"/>
-<polygon fill="#555555" stroke="#555555" points="633.38,-241.73 635.7,-235.81 630.19,-238.99 633.38,-241.73"/>
-</g>
-<!-- PTR_S1&#45;&gt;PTR_ANY -->
-<g id="edge21" class="edge">
-<title>PTR_S1&#45;&gt;PTR_ANY</title>
-<path fill="none" stroke="#555555" d="M621.75,-328.57C615.28,-317.84 606.03,-303.85 596,-292.97 580.61,-276.28 561.35,-260.24 544.26,-247.31"/>
-<polygon fill="#555555" stroke="#555555" points="545.84,-245.87 539.78,-243.96 543.32,-249.23 545.84,-245.87"/>
-</g>
-<!-- PTR_S1&#45;&gt;PTR_MORE -->
-<!-- PTR_S1&#45;&gt;PTR_S1_NIL -->
-<g id="edge24" class="edge">
-<title>PTR_S1&#45;&gt;PTR_S1_NIL</title>
-<path fill="none" stroke="#555555" d="M640.49,-328.79C647.07,-318.15 656.34,-304.18 666,-292.97 684.1,-271.96 707.73,-250.9 724.97,-236.47"/>
-<polygon fill="#555555" stroke="#555555" points="726.11,-238.25 729.39,-232.8 723.43,-235.02 726.11,-238.25"/>
-</g>
-<!-- PTR_MORE&#45;&gt;PTR_NULL -->
-<!-- PTR_MORE&#45;&gt;PTR_ANY -->
-<g id="edge22" class="edge">
-<title>PTR_MORE&#45;&gt;PTR_ANY</title>
-<path fill="none" stroke="#555555" d="M702.63,-328.84C693.45,-317.69 680.11,-303.08 666,-292.97 635.59,-271.17 597.84,-253.38 566.22,-240.61"/>
-<polygon fill="#555555" stroke="#555555" points="567.33,-238.79 560.98,-238.52 565.78,-242.69 567.33,-238.79"/>
-</g>
-<!-- PTR_MORE&#45;&gt;PTR_MORE_NIL -->
-<g id="edge25" class="edge">
-<title>PTR_MORE&#45;&gt;PTR_MORE_NIL</title>
-<path fill="none" stroke="#555555" d="M729.86,-328.89C739.5,-318.54 752.38,-304.85 764,-292.97 782,-274.55 802.85,-254.03 818.15,-239.12"/>
-<polygon fill="#555555" stroke="#555555" points="819.6,-240.64 822.44,-234.95 816.67,-237.63 819.6,-240.64"/>
-</g>
-<!-- PTR_PERSON_NIL&#45;&gt;PTR_BOT -->
-<g id="edge30" class="edge">
-<title>PTR_PERSON_NIL&#45;&gt;PTR_BOT</title>
-<path fill="none" stroke="#555555" d="M666.58,-199.43C680.58,-184.56 701.51,-162.35 718.65,-144.16"/>
-<polygon fill="#555555" stroke="#555555" points="719.75,-146.05 722.33,-140.24 716.69,-143.17 719.75,-146.05"/>
-</g>
-<!-- PTR_PERSON_NIL&#45;&gt;PTR_S1_NIL -->
-<!-- PTR_S1_NIL&#45;&gt;PTR_BOT -->
-<g id="edge31" class="edge">
-<title>PTR_S1_NIL&#45;&gt;PTR_BOT</title>
-<path fill="none" stroke="#555555" d="M748,-198.5C748,-184.97 748,-165.76 748,-148.97"/>
-<polygon fill="#555555" stroke="#555555" points="750.1,-148.97 748,-142.97 745.9,-148.97 750.1,-148.97"/>
-</g>
-<!-- PTR_S1_NIL&#45;&gt;PTR_MORE_NIL -->
-<!-- PTR_MORE_NIL&#45;&gt;PTR_BOT -->
-<g id="edge32" class="edge">
-<title>PTR_MORE_NIL&#45;&gt;PTR_BOT</title>
-<path fill="none" stroke="#555555" d="M825.62,-199.88C812.53,-185.22 792.8,-163.14 776.51,-144.9"/>
-<polygon fill="#555555" stroke="#555555" points="778.14,-143.58 772.58,-140.51 775.01,-146.38 778.14,-143.58"/>
-</g>
-<!-- STRUCT_PERSON -->
-<g id="node22" class="node">
-<title>STRUCT_PERSON</title>
-<polygon fill="#90ee90" stroke="black" points="976.5,-237.47 909.5,-237.47 909.5,-196.47 976.5,-196.47 976.5,-237.47"/>
-<text text-anchor="middle" x="943" y="-221.12" font-family="DejaVu Sans" font-size="13.00">Person</text>
-<text text-anchor="middle" x="943" y="-204.62" font-family="DejaVu Sans" font-size="13.00">age: int</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_PERSON -->
-<g id="edge36" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_PERSON</title>
-<path fill="none" stroke="#555555" d="M990.23,-446.07C979.97,-396.53 958.69,-293.77 948.58,-244.91"/>
-<polygon fill="#555555" stroke="#555555" points="950.69,-244.75 947.42,-239.3 946.58,-245.61 950.69,-244.75"/>
-</g>
-<!-- STRUCT_S1 -->
-<g id="node23" class="node">
-<title>STRUCT_S1</title>
-<polygon fill="#90ee90" stroke="black" points="1047,-237.47 993,-237.47 993,-196.47 1047,-196.47 1047,-237.47"/>
-<text text-anchor="middle" x="1020" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s1</text>
-<text text-anchor="middle" x="1020" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_S1 -->
-<g id="edge37" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_S1</title>
-<path fill="none" stroke="#555555" d="M998.66,-445.58C1003.32,-395.91 1012.89,-293.85 1017.46,-245.08"/>
-<polygon fill="#555555" stroke="#555555" points="1019.54,-245.41 1018.01,-239.24 1015.36,-245.02 1019.54,-245.41"/>
-</g>
-<!-- STRUCT_S2 -->
-<g id="node24" class="node">
-<title>STRUCT_S2</title>
-<polygon fill="#90ee90" stroke="black" points="1154.88,-237.47 1063.12,-237.47 1063.12,-196.47 1154.88,-196.47 1154.88,-237.47"/>
-<text text-anchor="middle" x="1109" y="-221.12" font-family="DejaVu Sans" font-size="13.00">s2</text>
-<text text-anchor="middle" x="1109" y="-204.62" font-family="DejaVu Sans" font-size="13.00">x: int, y: int</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_S2 -->
-<g id="edge38" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_S2</title>
-<path fill="none" stroke="#555555" d="M1008.31,-446.07C1030.23,-396.43 1075.73,-293.34 1097.24,-244.61"/>
-<polygon fill="#555555" stroke="#555555" points="1099.12,-245.54 1099.63,-239.21 1095.28,-243.85 1099.12,-245.54"/>
-</g>
-<!-- STRUCT_MORE -->
-<g id="node25" class="node">
-<title>STRUCT_MORE</title>
-<polygon fill="#90ee90" stroke="black" points="1225,-234.97 1171,-234.97 1171,-198.97 1225,-198.97 1225,-234.97"/>
-<text text-anchor="middle" x="1198" y="-212.87" font-family="DejaVu Sans" font-size="13.00">…</text>
-</g>
-<!-- STRUCT_TOP&#45;&gt;STRUCT_MORE -->
-<g id="edge39" class="edge">
-<title>STRUCT_TOP&#45;&gt;STRUCT_MORE</title>
-<path fill="none" stroke="#555555" d="M1018.31,-447.4C1030.2,-433.14 1045.02,-415.19 1058,-398.97 1102.92,-342.8 1154.32,-275.57 1180.57,-241"/>
-<polygon fill="#555555" stroke="#555555" points="1182,-242.59 1183.95,-236.54 1178.65,-240.05 1182,-242.59"/>
-</g>
-<!-- STRUCT_TOP&#45;&gt;MEM_TOP -->
-<!-- STRUCT_BOT -->
-<g id="node21" class="node">
-<title>STRUCT_BOT</title>
-<ellipse fill="#90ee90" stroke="black" cx="1020" cy="-111.99" rx="82.91" ry="28.99"/>
-<text text-anchor="middle" x="1020" y="-116.14" font-family="DejaVu Sans" font-size="13.00">⊥:struct</text>
-<text text-anchor="middle" x="1020" y="-99.64" font-family="DejaVu Sans" font-size="13.00">[struct bottom]</text>
-</g>
-<!-- STRUCT_BOT&#45;&gt;BOT -->
-<g id="edge62" class="edge">
-<title>STRUCT_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M982.84,-85.85C959.17,-69.85 929.19,-49.57 908.49,-35.56"/>
-<polygon fill="#555555" stroke="#555555" points="909.78,-33.9 903.63,-32.28 907.42,-37.38 909.78,-33.9"/>
-</g>
-<!-- STRUCT_PERSON&#45;&gt;STRUCT_BOT -->
-<g id="edge40" class="edge">
-<title>STRUCT_PERSON&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="#555555" d="M957.85,-196.12C968.43,-181.96 982.92,-162.59 995.24,-146.11"/>
-<polygon fill="#555555" stroke="#555555" points="996.85,-147.46 998.76,-141.4 993.49,-144.94 996.85,-147.46"/>
-</g>
-<!-- STRUCT_PERSON&#45;&gt;STRUCT_S1 -->
-<!-- STRUCT_S1&#45;&gt;STRUCT_BOT -->
-<g id="edge41" class="edge">
-<title>STRUCT_S1&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="#555555" d="M1020,-196.12C1020,-182.64 1020,-164.43 1020,-148.49"/>
-<polygon fill="#555555" stroke="#555555" points="1022.1,-148.87 1020,-142.87 1017.9,-148.87 1022.1,-148.87"/>
-</g>
-<!-- STRUCT_S1&#45;&gt;STRUCT_S2 -->
-<!-- STRUCT_S2&#45;&gt;STRUCT_BOT -->
-<g id="edge42" class="edge">
-<title>STRUCT_S2&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="#555555" d="M1091.84,-196.12C1079.5,-181.83 1062.57,-162.25 1048.25,-145.68"/>
-<polygon fill="#555555" stroke="#555555" points="1050,-144.5 1044.49,-141.33 1046.82,-147.24 1050,-144.5"/>
-</g>
-<!-- STRUCT_S2&#45;&gt;STRUCT_MORE -->
-<!-- STRUCT_MORE&#45;&gt;STRUCT_BOT -->
-<g id="edge43" class="edge">
-<title>STRUCT_MORE&#45;&gt;STRUCT_BOT</title>
-<path fill="none" stroke="#555555" d="M1177.76,-198.72C1173.05,-195 1167.95,-191.22 1163,-187.98 1135.19,-169.81 1102.49,-152.39 1075.38,-138.93"/>
-<polygon fill="#555555" stroke="#555555" points="1076.64,-137.21 1070.33,-136.44 1074.78,-140.97 1076.64,-137.21"/>
-</g>
-<!-- MEM_BOT -->
-<g id="node27" class="node">
-<title>MEM_BOT</title>
-<ellipse fill="#00008b" stroke="black" cx="1294" cy="-111.99" rx="44.7" ry="18"/>
-<text text-anchor="middle" x="1294" y="-107.89" font-family="DejaVu Sans" font-size="13.00" fill="white">⊥:mem</text>
-</g>
-<!-- MEM_TOP&#45;&gt;MEM_BOT -->
-<g id="edge44" class="edge">
-<title>MEM_TOP&#45;&gt;MEM_BOT</title>
-<path fill="none" stroke="#555555" d="M1294,-456.55C1294,-397.7 1294,-206.04 1294,-137.58"/>
-<polygon fill="#555555" stroke="#555555" points="1296.1,-137.74 1294,-131.74 1291.9,-137.74 1296.1,-137.74"/>
-</g>
-<!-- MEM_TOP&#45;&gt;TUPLE_TOP -->
-<!-- MEM_BOT&#45;&gt;BOT -->
-<g id="edge63" class="edge">
-<title>MEM_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M1273.96,-95.5C1263.49,-88.17 1250.14,-79.95 1237,-75 1125.68,-33.06 983.13,-22.53 918.55,-19.89"/>
-<polygon fill="#555555" stroke="#555555" points="918.65,-17.79 912.58,-19.66 918.49,-21.99 918.65,-17.79"/>
-</g>
-<!-- TUPLE1 -->
-<g id="node30" class="node">
-<title>TUPLE1</title>
-<polygon fill="#ffc0cb" stroke="none" points="1406.88,-372.47 1363.12,-372.47 1363.12,-319.47 1406.88,-319.47 1406.88,-372.47"/>
-<polygon fill="#ffc0cb" stroke="none" points="1363.12,-345.97 1363.12,-372.47 1406.88,-372.47 1406.88,-345.97 1363.12,-345.97"/>
-<polygon fill="none" stroke="black" points="1363.12,-345.97 1363.12,-372.47 1406.88,-372.47 1406.88,-345.97 1363.12,-345.97"/>
-<text text-anchor="start" x="1368.12" y="-355.12" font-family="DejaVu Sans" font-size="13.00">tuple</text>
-<polygon fill="black" stroke="none" points="1363.12,-319.47 1363.12,-345.97 1406.88,-345.97 1406.88,-319.47 1363.12,-319.47"/>
-<polygon fill="none" stroke="black" points="1363.12,-319.47 1363.12,-345.97 1406.88,-345.97 1406.88,-319.47 1363.12,-319.47"/>
-<text text-anchor="start" x="1370.38" y="-328.62" font-family="DejaVu Sans" font-size="13.00" fill="white">type</text>
-</g>
-<!-- TUPLE_TOP&#45;&gt;TUPLE1 -->
-<g id="edge47" class="edge">
-<title>TUPLE_TOP&#45;&gt;TUPLE1</title>
-<path fill="none" stroke="#555555" d="M1404.85,-456.57C1401.26,-436.74 1395.31,-403.91 1390.86,-379.34"/>
-<polygon fill="#555555" stroke="#555555" points="1392.94,-379.03 1389.81,-373.5 1388.81,-379.77 1392.94,-379.03"/>
-</g>
-<!-- TUPLE2 -->
-<g id="node31" class="node">
-<title>TUPLE2</title>
-<polygon fill="#ffc0cb" stroke="none" points="1466.88,-385.72 1423.12,-385.72 1423.12,-306.22 1466.88,-306.22 1466.88,-385.72"/>
-<polygon fill="#ffc0cb" stroke="none" points="1423.12,-359.22 1423.12,-385.72 1466.88,-385.72 1466.88,-359.22 1423.12,-359.22"/>
-<polygon fill="none" stroke="black" points="1423.12,-359.22 1423.12,-385.72 1466.88,-385.72 1466.88,-359.22 1423.12,-359.22"/>
-<text text-anchor="start" x="1428.12" y="-368.37" font-family="DejaVu Sans" font-size="13.00">tuple</text>
-<polygon fill="black" stroke="none" points="1423.12,-332.72 1423.12,-359.22 1466.88,-359.22 1466.88,-332.72 1423.12,-332.72"/>
-<polygon fill="none" stroke="black" points="1423.12,-332.72 1423.12,-359.22 1466.88,-359.22 1466.88,-332.72 1423.12,-332.72"/>
-<text text-anchor="start" x="1430.38" y="-341.87" font-family="DejaVu Sans" font-size="13.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1423.12,-306.22 1423.12,-332.72 1466.88,-332.72 1466.88,-306.22 1423.12,-306.22"/>
-<polygon fill="none" stroke="black" points="1423.12,-306.22 1423.12,-332.72 1466.88,-332.72 1466.88,-306.22 1423.12,-306.22"/>
-<text text-anchor="start" x="1430.38" y="-315.37" font-family="DejaVu Sans" font-size="13.00" fill="white">type</text>
-</g>
-<!-- TUPLE_TOP&#45;&gt;TUPLE2 -->
-<g id="edge48" class="edge">
-<title>TUPLE_TOP&#45;&gt;TUPLE2</title>
-<path fill="none" stroke="#555555" d="M1412.99,-456.83C1417.76,-440.46 1425.17,-415.04 1431.65,-392.78"/>
-<polygon fill="#555555" stroke="#555555" points="1433.64,-393.48 1433.3,-387.13 1429.6,-392.3 1433.64,-393.48"/>
-</g>
-<!-- TUPLEN -->
-<g id="node32" class="node">
-<title>TUPLEN</title>
-<polygon fill="#ffc0cb" stroke="none" points="1526.88,-398.97 1483.12,-398.97 1483.12,-292.97 1526.88,-292.97 1526.88,-398.97"/>
-<polygon fill="#ffc0cb" stroke="none" points="1483.12,-372.47 1483.12,-398.97 1526.88,-398.97 1526.88,-372.47 1483.12,-372.47"/>
-<polygon fill="none" stroke="black" points="1483.12,-372.47 1483.12,-398.97 1526.88,-398.97 1526.88,-372.47 1483.12,-372.47"/>
-<text text-anchor="start" x="1488.12" y="-381.62" font-family="DejaVu Sans" font-size="13.00">tuple</text>
-<polygon fill="black" stroke="none" points="1483.12,-345.97 1483.12,-372.47 1526.88,-372.47 1526.88,-345.97 1483.12,-345.97"/>
-<polygon fill="none" stroke="black" points="1483.12,-345.97 1483.12,-372.47 1526.88,-372.47 1526.88,-345.97 1483.12,-345.97"/>
-<text text-anchor="start" x="1490.38" y="-355.12" font-family="DejaVu Sans" font-size="13.00" fill="white">type</text>
-<polygon fill="black" stroke="none" points="1483.12,-319.47 1483.12,-345.97 1526.88,-345.97 1526.88,-319.47 1483.12,-319.47"/>
-<polygon fill="none" stroke="black" points="1483.12,-319.47 1483.12,-345.97 1526.88,-345.97 1526.88,-319.47 1483.12,-319.47"/>
-<text text-anchor="start" x="1498.62" y="-328.62" font-family="DejaVu Sans" font-size="13.00" fill="white">…</text>
-<polygon fill="black" stroke="none" points="1483.12,-292.97 1483.12,-319.47 1526.88,-319.47 1526.88,-292.97 1483.12,-292.97"/>
-<polygon fill="none" stroke="black" points="1483.12,-292.97 1483.12,-319.47 1526.88,-319.47 1526.88,-292.97 1483.12,-292.97"/>
-<text text-anchor="start" x="1490.38" y="-302.12" font-family="DejaVu Sans" font-size="13.00" fill="white">type</text>
-</g>
-<!-- TUPLE_TOP&#45;&gt;TUPLEN -->
-<g id="edge49" class="edge">
-<title>TUPLE_TOP&#45;&gt;TUPLEN</title>
-<path fill="none" stroke="#555555" d="M1424.21,-457.82C1438.47,-443.17 1459.34,-420.61 1475,-398.97 1476.4,-397.02 1477.8,-395.01 1479.17,-392.95"/>
-<polygon fill="#555555" stroke="#555555" points="1480.91,-394.14 1482.41,-387.96 1477.38,-391.86 1480.91,-394.14"/>
-</g>
-<!-- TUPLE_BOT -->
-<g id="node29" class="node">
-<title>TUPLE_BOT</title>
-<ellipse fill="#ffc0cb" stroke="black" cx="1426" cy="-111.99" rx="44.7" ry="18"/>
-<text text-anchor="middle" x="1426" y="-107.89" font-family="DejaVu Sans" font-size="13.00">⊥:tuple</text>
-</g>
-<!-- TUPLE_BOT&#45;&gt;BOT -->
-<g id="edge64" class="edge">
-<title>TUPLE_BOT&#45;&gt;BOT</title>
-<path fill="none" stroke="#555555" d="M1401.48,-96.69C1387.21,-89.03 1368.61,-80.13 1351,-75 1193.97,-29.27 996.8,-20.82 918.41,-19.3"/>
-<polygon fill="#555555" stroke="#555555" points="918.75,-17.21 912.72,-19.21 918.68,-21.41 918.75,-17.21"/>
-</g>
-<!-- TUPLE1&#45;&gt;TUPLE_BOT -->
-<g id="edge50" class="edge">
-<title>TUPLE1&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="#555555" d="M1389.47,-319.7C1397.39,-274.85 1413.82,-181.9 1421.66,-137.56"/>
-<polygon fill="#555555" stroke="#555555" points="1423.69,-138.14 1422.66,-131.86 1419.55,-137.4 1423.69,-138.14"/>
-</g>
-<!-- TUPLE1&#45;&gt;TUPLE2 -->
-<!-- TUPLE2&#45;&gt;TUPLE_BOT -->
-<g id="edge51" class="edge">
-<title>TUPLE2&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="#555555" d="M1441.84,-306.4C1437.91,-258.37 1431.3,-177.75 1428,-137.46"/>
-<polygon fill="#555555" stroke="#555555" points="1430.13,-137.74 1427.55,-131.93 1425.95,-138.08 1430.13,-137.74"/>
-</g>
-<!-- TUPLE2&#45;&gt;TUPLEN -->
-<!-- TUPLEN&#45;&gt;TUPLE_BOT -->
-<g id="edge52" class="edge">
-<title>TUPLEN&#45;&gt;TUPLE_BOT</title>
-<path fill="none" stroke="#555555" d="M1487.37,-293.19C1470.79,-244.5 1446.69,-173.75 1434.2,-137.07"/>
-<polygon fill="#555555" stroke="#555555" points="1436.27,-136.64 1432.35,-131.63 1432.3,-137.99 1436.27,-136.64"/>
-</g>
-</g>
-</svg>
diff --git a/chapter10a/docs/load-after-store-after.json b/chapter10a/docs/load-after-store-after.json
deleted file mode 100644
index d27efe5b..00000000
--- a/chapter10a/docs/load-after-store-after.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "ver": 1,
- "comp": "load-after-store-after",
- "step": 1,
- "roots": [10],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 4, "label": "arg", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "DATA", "label": null}], "proj": {"par": 1, "idx": 2}},
- {"id": 5, "label": "new Box", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 4, "role": "DATA", "label": null}], "proj": null},
- {"id": 10, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 4, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/load-after-store-after.svg b/chapter10a/docs/load-after-store-after.svg
deleted file mode 100644
index 78867d38..00000000
--- a/chapter10a/docs/load-after-store-after.svg
+++ /dev/null
@@ -1,97 +0,0 @@
-<svg aria-label="Compiler graph" width="598" height="454" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 598 454" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M571,46 C571,70 236,41 236,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M388,118 L388,130 Q388,138 380,138 L376,138 Q368,138 368,146 L368,166" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M84,118 L84,140 Q84,148 92,148 L384,148 Q392,148 392,156 L392,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M236,118 L236,123 Q236,128 241,128 L408,128 Q416,128 416,136 L416,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M380,222 L380,227 Q380,232 385,232 L418,232 Q426,232 426,240 L426,270" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M84,118 L84,140 Q84,148 92,148 L442,148 Q450,148 450,156 L450,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M508,118 L508,224 Q508,232 500,232 L482,232 Q474,232 474,240 L474,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #4 · DATA</title></path><path class="edge MEM" id="e10i1" d="M438,326 L438,331 Q438,336 443,336 L470,336 Q478,336 478,344 L478,374" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[1] → #8 · MEM</title></path><path class="edge DATA" id="e10i2" d="M508,118 L508,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[2] → #4 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(328,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="120"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(328,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n4" data-id="4" transform="translate(448,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#4 arg
-Projection 2 of #1
-Type not computed
-
-[0] → #1 DATA</title></g><g class="node" id="n5" data-id="5" transform="translate(24,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Box</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Box
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(176,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(320,172)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(378,276)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #4 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n10" data-id="10" transform="translate(418,380)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#10 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #4 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/load-after-store-before.json b/chapter10a/docs/load-after-store-before.json
deleted file mode 100644
index ba4e2e0b..00000000
--- a/chapter10a/docs/load-after-store-before.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "ver": 1,
- "comp": "load-after-store-before",
- "step": 1,
- "roots": [10],
- "scope": 0,
- "nodes": [
- {"id": 1, "label": "Start", "type": null, "kind": "CTRL", "edges": [], "proj": null},
- {"id": 3, "label": "$mem", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 1, "role": "MEM", "label": null}], "proj": {"par": 1, "idx": 1}},
- {"id": 4, "label": "arg", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "DATA", "label": null}], "proj": {"par": 1, "idx": 2}},
- {"id": 5, "label": "new Box", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}], "proj": null},
- {"id": 6, "label": "#0", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 1, "role": "ASSOC", "label": null}], "proj": null},
- {"id": 7, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 3, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 6, "role": "DATA", "label": null}], "proj": null},
- {"id": 8, "label": "Store p.x", "type": null, "kind": "MEM", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 7, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 4, "role": "DATA", "label": null}], "proj": null},
- {"id": 9, "label": "Load p.x", "type": null, "kind": "DATA", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 5, "role": "DATA", "label": null}, {"idx": 3, "def": 0, "role": "DATA", "label": null}], "proj": null},
- {"id": 10, "label": "Return", "type": null, "kind": "CTRL", "edges": [{"idx": 0, "def": 0, "role": "CTRL", "label": null}, {"idx": 1, "def": 8, "role": "MEM", "label": null}, {"idx": 2, "def": 9, "role": "DATA", "label": null}], "proj": null}
- ],
- "groups": [
- ]
-}
diff --git a/chapter10a/docs/load-after-store-before.svg b/chapter10a/docs/load-after-store-before.svg
deleted file mode 100644
index 497c915d..00000000
--- a/chapter10a/docs/load-after-store-before.svg
+++ /dev/null
@@ -1,103 +0,0 @@
-<svg aria-label="Compiler graph" width="598" height="558" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 598 558" style="font-family: sans-serif;"><style>
- html, body { height:100%; margin:0; font-family:sans-serif; }
- .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
- .source { padding:8px; border-bottom:1px solid #ccc; }
- #program { width:min(600px,80vw); vertical-align:middle; }
- #status { margin-top:4px; }
- #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
- #elk { width:100%; height:100%; }
- #graph svg { display:block; }
- .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
- .hint { color:#616c78; }
- .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
- .edge { fill:none; stroke-width:1.5; }
- .edge.CTRL { stroke-width:2; }
- .edge.ASSOC { stroke-dasharray:4 4; }
- .edge.PARSER { stroke-dasharray:5 4; }
- .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
- .edge.selected { stroke-width:3.5; }
- .edge.bundle { stroke-width:4; }
- .edge.bundle.selected { stroke-width:6; }
- .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
- .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
- .node { cursor:pointer; }
- .box { stroke:#758191; stroke-width:1; }
- .node.held .box { stroke-dasharray:5 3; }
- .node.near .box { stroke:#c18221; stroke-width:2; }
- .node.focus .box { stroke:#9c4900; stroke-width:3; }
- .node.selected .box { stroke:#1569b9; stroke-width:3; }
- .node.folded .box { stroke-width:4; }
- .node.folding .box { fill:#f4ccd7; }
- .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
- .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
- .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
- .node.error .box { stroke:#b42318; stroke-width:4; }
- #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
- .peep-ghosts { pointer-events:none; }
- .region-box { stroke:#9da9b8; stroke-width:1.5; }
- .fold-btn { cursor:pointer; }
- .fold-btn rect { fill:white; stroke:#596674; }
- .fold-btn text { font-size:14px; fill:#152330; }
- .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
- .shortcut { cursor:pointer; }
- .shortcut path { fill:none; stroke-width:1.5; }
- .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
- .shortcut text { font-size:11px; fill:#783030; }
- .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
- .label { font-size:12px; fill:#152330; font-weight:600; }
- .node-id { font-size:10px; fill:#596674; font-weight:400; }
- .type { font-size:11px; fill:#455768; }
- .port { stroke:#536477; stroke-width:1; }
- .row { stroke:#b6afcf; stroke-width:1; }
- .bind { font-size:12px; fill:#152330; }
- .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
- #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
- max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
- background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
- .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
- .button { color:white; background:black; font-size:20px; min-width:30px; }
- .button:disabled { background:grey; }
- .count { font-size:20px; min-width:35px; text-align:center; }
- #N { width:6ch; }
- #scrub { width:clamp(120px,35vw,600px); }
- </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e6i0" d="M267,46 C267,70 514,41 514,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #1 · ASSOC</title></path><path class="edge MEM" id="e7i1" d="M84,118 L84,130 Q84,138 92,138 L272,138 Q280,138 280,146 L280,166" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#7[1] → #3 · MEM</title></path><path class="edge DATA" id="e7i2" d="M362,118 L362,123 Q362,128 357,128 L312,128 Q304,128 304,136 L304,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #5 · DATA</title></path><path class="edge DATA" id="e7i3" d="M514,118 L514,130 Q514,138 506,138 L336,138 Q328,138 328,146 L328,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[3] → #6 · DATA</title></path><path class="edge MEM" id="e8i1" d="M292,222 L292,227 Q292,232 287,232 L275,232 Q267,232 267,240 L267,270" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#8[1] → #7 · MEM</title></path><path class="edge DATA" id="e8i2" d="M362,118 L362,234 Q362,242 354,242 L299,242 Q291,242 291,250 L291,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[2] → #5 · DATA</title></path><path class="edge DATA" id="e8i3" d="M204,118 L204,123 Q204,128 209,128 L213,128 Q221,128 221,136 L221,244 Q221,252 229,252 L307,252 Q315,252 315,260 L315,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[3] → #4 · DATA</title></path><path class="edge MEM" id="e9i1" d="M279,326 L279,331 Q279,336 284,336 L330,336 Q338,336 338,344 L338,374" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#9[1] → #8 · MEM</title></path><path class="edge DATA" id="e9i2" d="M362,118 L362,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#9[2] → #5 · DATA</title></path><path class="edge MEM" id="e10i1" d="M279,326 L279,478" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#10[1] → #8 · MEM</title></path><path class="edge DATA" id="e10i2" d="M350,430 L350,435 Q350,440 345,440 L317,440 Q309,440 309,448 L309,478" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[2] → #9 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n1" data-id="1" transform="translate(24,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #1</tspan></text><text class="type" text-anchor="middle" y="35" x="120"/><title>#1 Start
-Type not computed
-
-</title></g><g class="node" id="n3" data-id="3" transform="translate(24,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #3/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#3 $mem
-Projection 1 of #1
-Type not computed
-
-[0] → #1 MEM</title></g><g class="node" id="n4" data-id="4" transform="translate(144,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#4 arg
-Projection 2 of #1
-Type not computed
-
-[0] → #1 DATA</title></g><g class="node" id="n5" data-id="5" transform="translate(302,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>new Box</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#5 new Box
-Type not computed
-
-[0] → — CTRL</title><circle class="port" cx="60" cy="-3" r="3" fill="white"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(454,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>#0</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#6 #0
-Type not computed
-
-[0] → #1 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(232,172)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#7 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #3 MEM
-[2] → #5 DATA
-[3] → #6 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n8" data-id="8" transform="translate(219,276)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Store p.x</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#8 Store p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #7 MEM
-[2] → #5 DATA
-[3] → #4 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n9" data-id="9" transform="translate(290,380)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Load p.x</tspan><tspan class="node-id">  #9</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#9 Load p.x
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #5 DATA
-[3] → — DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="white"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n10" data-id="10" transform="translate(219,484)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60"/><title>#10 Return
-Type not computed
-
-[0] → — CTRL
-[1] → #8 MEM
-[2] → #9 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/chapter10a/docs/type-control.svg b/chapter10a/docs/type-control.svg
deleted file mode 100644
index d4b79c53..00000000
--- a/chapter10a/docs/type-control.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="61" height="20" viewBox="0 0 61 20" role="img" aria-labelledby="title">
- <title id="title">Control</title>
- <rect width="61" height="20" rx="2" fill="#ffff00"/>
- <text x="30.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Control</text>
-</svg>
diff --git a/chapter10a/docs/type-integer.svg b/chapter10a/docs/type-integer.svg
deleted file mode 100644
index 97d03372..00000000
--- a/chapter10a/docs/type-integer.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="60" height="20" viewBox="0 0 60 20" role="img" aria-labelledby="title">
- <title id="title">Integer</title>
- <rect width="60" height="20" rx="2" fill="#add8e6"/>
- <text x="30.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Integer</text>
-</svg>
diff --git a/chapter10a/docs/type-memory.svg b/chapter10a/docs/type-memory.svg
deleted file mode 100644
index 16b5121f..00000000
--- a/chapter10a/docs/type-memory.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="67" height="20" viewBox="0 0 67 20" role="img" aria-labelledby="title">
- <title id="title">Memory</title>
- <rect width="67" height="20" rx="2" fill="#00008b"/>
- <text x="33.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#ffffff">Memory</text>
-</svg>
diff --git a/chapter10a/docs/type-pointer.svg b/chapter10a/docs/type-pointer.svg
deleted file mode 100644
index 7604492e..00000000
--- a/chapter10a/docs/type-pointer.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="62" height="20" viewBox="0 0 62 20" role="img" aria-labelledby="title">
- <title id="title">Pointer</title>
- <rect width="62" height="20" rx="2" fill="#008000"/>
- <text x="31.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#ffffff">Pointer</text>
-</svg>
diff --git a/chapter10a/docs/type-struct.svg b/chapter10a/docs/type-struct.svg
deleted file mode 100644
index 97a16562..00000000
--- a/chapter10a/docs/type-struct.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="52" height="20" viewBox="0 0 52 20" role="img" aria-labelledby="title">
- <title id="title">Struct</title>
- <rect width="52" height="20" rx="2" fill="#90ee90"/>
- <text x="26.0" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Struct</text>
-</svg>
diff --git a/chapter10a/docs/type-tuple.svg b/chapter10a/docs/type-tuple.svg
deleted file mode 100644
index 691478ac..00000000
--- a/chapter10a/docs/type-tuple.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="47" height="20" viewBox="0 0 47 20" role="img" aria-labelledby="title">
- <title id="title">Tuple</title>
- <rect width="47" height="20" rx="2" fill="#ffc0cb"/>
- <text x="23.5" y="14" text-anchor="middle" font-family="Arial, sans-serif" font-size="13" fill="#000000">Tuple</text>
-</svg>