From c57ca6a24f3c91d45266431519b64f43e99af5fe Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Mon, 14 Sep 2026 10:20:34 +0700 Subject: [PATCH] The renderer's own output, spelled the way the renderer spells it The renderer check greps a line out of NEXT.md, and NEXT.md is a scratch document that gets rewritten. The line went, the grep went empty, and the empty-needle guard did its job and said so -- into a report nobody was reading. Behind that noise the page was genuinely wrong: the colon-to-dot sweep rewrote every field label in the corpus and lib/render.ml writes .field today, so the inspector block on the page had been showing {:x 1.5 :y 0} for a renderer that prints {.x 1.5 .y 0}. test_repl.ml's fixtures are the authority and they are dots throughout, with an enum member still a colon; the page now matches. The anchor moves to test/programs/raylib-imported.flan, which dune test builds and runs, so it cannot quietly stop saying it. The LLVM excerpt beside it moved too: a --dev main pushes a condition frame before anything else now, which shifted the SSA numbering by one. The three quoted lines are what flan emit --dev prints today, with the frame push marked as elided rather than silently dropped. --- web/examples/quotes.sh | 10 +++++++++- web/index.html | 13 +++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/web/examples/quotes.sh b/web/examples/quotes.sh index ee3126a..6e0b97d 100644 --- a/web/examples/quotes.sh +++ b/web/examples/quotes.sh @@ -99,7 +99,15 @@ want "shim wrapper" "$("$FLAN" shim "$here/shimdemo.flan" | grep 'GetMousePositi want "raylib binding" "$(grep -F 'unload-texture' "$root/vendor/raylib/raylib.flan")" want "agent declare" "$(grep -F 'flan_agent_poll' "$root/vendor/agent/agent.flan" | head -1)" want "conditions.org" "$(grep -F 'Innermost frame offering the name wins' "$root/conditions.org")" -want "renderer" "$(grep -F ':r 17 :g 34 :b 51 :a 68' "$root/NEXT.md")" +# The value renderer, anchored in the test corpus rather than in NEXT.md. It +# used to grep NEXT.md for this line, and NEXT.md is a rolling scratch document: +# the line was rewritten out of it, the grep went empty, and the check spent +# weeks reporting "whatever this quotes has moved" while the page really had +# gone stale -- the colon-to-dot sweep rewrote every field label in the corpus +# and left the renderer's own output on this page spelled the old way. An anchor +# has to be somewhere that cannot quietly stop saying the thing, and the corpus +# is such a place, because `dune test` builds and runs it. +want "renderer" "$(grep -oF '{.r 17 .g 34 .b 51 .a 68}' "$root/test/programs/raylib-imported.flan" | head -1)" # The Emacs bindings, from the keymap rather than from any prose about it. for k in "C-c C-c" "C-c C-k" "C-x C-e" "C-c C-b" "C-c C-v" "C-c C-x"; do diff --git a/web/index.html b/web/index.html index b43e46b..1b77603 100644 --- a/web/index.html +++ b/web/index.html @@ -1569,9 +1569,10 @@ function that is current.

define {} @"flan.main"(ptr %xfer) { entry: - %t7 = alloca %slice - %t1 = load ptr, ptr @"flan.cell.work" - %t2 = call i32 %t1(i32 3, ptr %xfer) + ;; the frame push, elided — see conditions, above + %t8 = alloca %slice + %t2 = load ptr, ptr @"flan.cell.work" + %t3 = call i32 %t2(i32 3, ptr %xfer)

The call site loads the cell rather than naming @"flan.work" directly. The signature carries ptr %xfer — the transfer channel from @@ -1666,10 +1667,10 @@ there, in the thunk. What comes back looks like this:

big                       18446744073709551615
 col                       :blue
-(.pos b)                  (V {:x 1.5 :y 0})
-b                         (Blob {:id 7 :name "sandy \"quoted\"" :pos (V {:x 1.5 :y 0}) :tags [ 0 42 0]})
+(.pos b)                  (V {.x 1.5 .y 0})
+b                         (Blob {.id 7 .name "sandy \"quoted\"" .pos (V {.x 1.5 .y 0}) .tags [ 0 42 0]})
 (slice (.tags b) 0 3)     [ 0 42 0]
-(rl/get-color 0x11223344) (rl/Color {:r 17 :g 34 :b 51 :a 68})
+(rl/get-color 0x11223344) (rl/Color {.r 17 .g 34 .b 51 .a 68})
 sim/grid                  [ [ 0 0 0 0 0 0 0 0 ...] [ 0 ... ] ...]

A pointer is never followed; it renders as <ptr>. Following one