150 Commits

Author SHA1 Message Date
9d0d42e467 A generic struct's copy prints as (Pair i32 {...}), crosses to C behind a pointer, names each use that made it when refused, settles literal fields at the wider type, and is laid out by stores and restarts that first name it 2026-09-25 16:59:11 +07:00
a95b4c288e Merge branch 'master' into worktree-agent-a37bbb17fdd22924a 2026-09-25 16:35:58 +07:00
4054c4921b A defstruct whose fields introduce $t or an array length $n is a generic struct, each application of it an ordinary struct copy that generic functions bind against, and a printed call is evaluated once 2026-09-25 16:08:14 +07:00
4b64dc5f65 Code-carrying dev requests name their syntax and starting line and column, so a .fln snippet sent from the middle of a buffer reads with the buffer's own locations 2026-09-25 15:57:09 +07:00
680b8e7e59 A refusal inside a generic copy names each call that asked for it, a refused generic body is reported once, and a type variable prints with its $ 2026-09-25 15:13:12 +07:00
610e9fcf9d A parent's handler reads a name and message made in context/temp, whole and good until the frame ends, and the handler-case landing no longer holds a buffer of its own 2026-09-25 14:36:46 +07:00
38055b8fdc A file with no main opens a session, and a crash in an evaluated expression leaves the session running 2026-09-25 14:04:14 +07:00
b2eb81f7bf A slice or pointer can be read-only, and what it reaches cannot be written through it 2026-09-25 13:39:04 +07:00
5a78cdd202 Merge master 2026-09-25 13:36:54 +07:00
f3d969618d A class slot can carry a type, and set writes a declared slot 2026-09-25 13:32:16 +07:00
639ff1859c Aborting an expression that trapped in the park abandons it by a jump back to the poll that called it, and the session stays 2026-09-25 13:28:16 +07:00
f87d596bdc A file with a broken form still starts a session, a package's macros expand bare from its file, a delivery a running program never polls for says so with a fix that compiles, and aborting an expression stopped in the park abandons it and keeps the session 2026-09-25 13:06:36 +07:00
16427f8d07 A class slot may be a class or an Option, an int widens into a float slot when exact, a gained typed slot starts at its zero, and a migration never re-enters itself 2026-09-25 12:55:25 +07:00
b74002be02 Merge master 2026-09-25 12:54:55 +07:00
bfd176cce9 Merge master: a handler clause runs without its own handler in force, over the condition descriptor, and StaleCall is an Error 2026-09-25 12:50:01 +07:00
35f455acb3 The's refusal of a dyn says what the boundary does at that type, elements that cannot become a dyn are refused against each other, two literal arms meet at the wider type, and the renamed prelude function and a second startup warning stay out of sight 2026-09-25 12:49:02 +07:00
1fb4b37125 A restart that takes values can be taken from the break loop, which asks for one per parameter and stores them into the frame as an invoke-restart would 2026-09-25 12:46:23 +07:00
11e1ff10a7 flan dev starts on a file with no main and links the agent into every program it builds, C-c C-k loads a file keeping what compiles, and an expression sent from a package's file resolves in that package 2026-09-25 12:44:15 +07:00
d8945ae4ae The address of read-only storage is a (Ptr const T), which nothing is written through and which a C const T * parameter takes 2026-09-25 12:43:04 +07:00
aedd50c646 Merge branch 'master' into worktree-agent-ac750a5e83cab251b
# Conflicts:
#	lib/check.ml
2026-09-25 12:17:58 +07:00
1d219b526c Merge master into the typed class slots lane 2026-09-25 12:14:42 +07:00
73dfaacbc8 A condition type may name a parent and a handler for Error catches every built-in error, a signal passes one descriptor carrying its chain, name, sentence and site, and the break loop shows the sentence the runtime wrote 2026-09-25 12:05:13 +07:00
77497cfc2c A generic's copy made by an evaluated expression is disassembled from that expression's module, and one copy that cannot be shown no longer hides the others 2026-09-25 12:00:50 +07:00
6c8611cece Merge master 2026-09-25 11:53:00 +07:00
0636eb3b8d A generic's copy that the file does not make is named in its lowering rather than left out 2026-09-25 11:47:11 +07:00
20fa04d9df A program never waits on an editor that stops reading its pushes, and the editor keeps a bounded tail of the program's output 2026-09-25 11:42:54 +07:00
b05a97b029 A generic's name disassembles to its copies, each headed by the types it was called at, and is listed among the program's names 2026-09-25 11:41:31 +07:00
2682214499 A defclass slot may declare a type that every store into it checks, and set writes a declared slot 2026-09-25 11:40:08 +07:00
c671f23b2c Merge master 2026-09-25 11:36:46 +07:00
680c12e686 A restart frame carries where its clause is written, its :report sentence and whether a handler-case made it up, and the break loop shows the first two and hides the third 2026-09-25 11:35:12 +07:00
0b9ae9318e flan build and flan run of a file with no main say so and show one, rather than failing at the link 2026-09-25 11:26:13 +07:00
14da41e1d9 A changed signature installs, its stale callers are named, and a handler is off while its own clause runs 2026-09-25 11:17:48 +07:00
f4725788c5 The daemon pushes the program's output and the watch table to an editor that asked for them, and every key a Flan buffer's own map binds is that buffer's under Evil 2026-09-25 11:16:49 +07:00
ed8dbbcd62 A handler-bind clause runs with only the handlers outside its own form in force, and a stale call in main's running loop stays listed until the callee changes back or the program re-runs
The first is CLHS 9.1.4.1: a clause that signalled the condition it handles used to re-enter itself until the stack ran out. The stale list now names a lifted clause by the function it is written in, and BUILT.md's cost line is measured against master.
2026-09-25 11:15:52 +07:00
40bd96ec65 A source heading escapes control characters, names its file by the path it was given, and quotes a form cut at a character boundary 2026-09-25 11:08:11 +07:00
0d771494a6 Merge branch 'master' into worktree-agent-a8f5ad274482eeb9c 2026-09-25 11:07:02 +07:00
573076994e Merge branch 'master' into worktree-agent-a0a469774e7454c6c
# Conflicts:
#	lib/loc.ml
#	lib/x86.ml
2026-09-25 10:59:24 +07:00
146be41bd4 flan dev refuses at start a TMPDIR that is missing or too deep for a socket path, and a program with no main, and tells a program with no agent how to add one
The dropped (agent/start ...) note named the wrong cause rather than being unreachable: an over-long socket path fails the agent's bind while it is linked. That case is now refused before anything is built, and the comments, the TODO entry and the fixture say so.
2026-09-25 10:43:33 +07:00
39d35f51db A function whose signature changed installs, and a caller compiled against the old one stops on StaleCall at the call
A dev cell carries its body's signature word beside the body, every call through a cell (and every function value taken from one) compares it with the word the site was compiled for, and the session lists the stale callers by file and line on the reply. Both backends, both installers; release builds have neither the word nor the compare.
2026-09-25 10:40:18 +07:00
066fb18940 Every Flan form heads the code it produced in the emitted IR, the x86 listing and both disassembly buffers, and the objects are the same with or without it 2026-09-25 10:34:07 +07:00
3636f31cba A running program's reply never says it has not called (agent/start ...), because the agent's constructor has bound the socket before main 2026-09-25 10:16:25 +07:00
96314accd0 One library pipeline builds every program, one alias names the corpus, and a closed session leaves no directory behind 2026-09-25 08:53:45 +07:00
6f0f4957f4 The break buffer, the inspector and the watch table show what a stopped program holds 2026-09-25 08:37:15 +07:00
54ec52fde6 A dev session that ends cleanly takes its directories with it, and Build.executable says where the IR it kept is 2026-09-25 07:28:34 +07:00
377ada8d27 The inspector says where a slot's value is stored 2026-09-25 07:27:25 +07:00
cf028e23ea A class and each case of a data type are names on the definitions list 2026-09-25 07:09:46 +07:00
8b354d4bc8 The notes say what is built: no pool, frames on x86, implicit widening, and the budget in the spec 2026-09-25 07:05:55 +07:00
57fe91f303 Five records become one, and every citation lands somewhere
FIX.org, NEXT.md, DISCUSS.org, docs/DISCUSS.md and the session handoff at the
root are one TODO.org now: 293 entries under seven subsystem headings, each
carrying an org keyword that says where it stands. A DONE entry is a few lines
saying what was decided and what that rules out; the reasoning that would not
compress — the embedding spike and the four reports the hand-written x86
backend was built from — moved into docs/BUILT.md instead, and its entries
point there in one line.

Every entry was checked against the tree before it got a keyword, and the
prose was wrong in both directions. Things the deleted files called open were
built: the first-evaluation stall, main being redefinable, macro parameter
lists, the type-limit constants, the array constructors, the byte fills,
inc/dec, the discard's fontification, the Emacs buffers, rt_die's _exit, the
backtrace surface, and the acceptance failure that could print and still exit
zero. Things they called done were not: the backend reports' no-plan buckets
had gone stale in the other direction, the value-dependent defvar was
superseded rather than built, and macro-expansion source locations are on an
unmerged lane, so that entry is NEXT and names the branch.

Every comment that cited one of the five by name now cites a heading that
exists, in TODO.org or in docs/BUILT.md. The session reports under
docs/handoffs/ keep naming the files they worked on, because rewriting them
would falsify what those sessions did; each carries a note saying where the
content went.
2026-09-21 21:05:48 +07:00
ca237adb22 A function that captures and a function that cannot are two types
# Conflicts:
#	FIX.org
2026-09-21 16:17:10 +07:00
2d1d88e9d1 A macro has a body, and the entry that said otherwise
Review follow-ups on the mode pass.

The regression first, because it is the one that cost something: giving
macros a kind of their own took them out of three completion tables.
flan-disassemble, flan-disassemble-ir and flan-lowering each filtered
flan--defs on kind "fn", which had been the whole truth right up until
this branch made it half of one. A macro is compiled -- defmacro is a
defn by the time anything emits code -- so all three genuinely work on
one, and only the offer had gone. One flan--compiled-kinds names both
words and the three sites read it.

Then four sentences in the FIX.org entry that were not true, which
matters more than it sounds: that file is the history somebody reads
later to find out what happened.

The corpus claim was the bad one. It said the whole corpus round-trips
with zero differing lines. It does not, and never did -- the script that
measured it bound inhibit-message around its own reporting, which in
batch means the differences were found and then swallowed. Measured
properly: 317 files, 22 files and 389 lines differing before, 20 and 373
after. Sixteen lines fixed in two files, no new difference introduced,
and 373 lines still differing that this pass never looked at.

The other three: the fns/macros dedup is required by the new rows and is
not a fix to a bug that was there before -- a macro used to appear once,
as a fn. handler-case was already a keyword. loops.flan has three
labelled loops and dotimes-range.flan has the other two.

And three gaps the review found while checking: array-fill and array-gen
were never in the keyword list, Unit was in the type rule while the
parser refuses the word, and a prelude macro's row carried a bare name
where a program's carried its parameters. A check that pulls every head
out of parse.ml and diffs it against the three lists now comes back
empty, which is what the docstring had started claiming.
2026-09-21 16:00:49 +07:00