96 Commits

Author SHA1 Message Date
ae41ec8454 An install reply's :fns and flan reload's summary name each fn once, as it is written. 2026-09-26 18:29:54 +07:00
1215db7d26 Merge master into the arity lane. 2026-09-26 18:29:54 +07:00
d6c33928f5 A name an as bound is refused as itself when assigned, in the program and in a stopped frame alike. 2026-09-26 18:16:13 +07:00
7d2da19c0c A fn form's arities are one definition by an id the form is given, and a caller of a removed arity stops on StaleCall and is compiled again whenever its call checks. 2026-09-26 18:08:41 +07:00
83bb65957d Each name an as binds is a slot of its own under its name, so the break loop's locals show it with what the test found. 2026-09-26 17:59:59 +07:00
e4d0e9c60e A pause mark on any column of a condition keeps what it binds, an as in parentheses gets its own refusal, and what an as finds is held in one slot. 2026-09-26 17:52:06 +07:00
dd719766ee A fn's arities are one form, fn f with a (params) -> R line per arity, and evaluating it replaces every arity at once. 2026-09-26 17:35:18 +07:00
179156b105 A function name has one version per arity, and a call picks the version by its number of arguments. 2026-09-26 17:08:15 +07:00
178c129c97 A .fln name carries no ? or !, and .fln has T?, x ?? d, x!, if let over a plain name and a?.b chaining. 2026-09-26 14:54:58 +07:00
7db1a81d1f Builtins, prelude, vendor and raylib predicates are named with is- or has- and no name carries a ? or !. 2026-09-26 14:34:36 +07:00
267db2cd91 The typed read-only text type is spelled str, and string is refused with that fix. 2026-09-26 05:22:24 +07:00
2135f6d37f Merge branch 'master' into worktree-agent-a46233a32d1912c78 2026-09-25 23:27:55 +07:00
6583392504 A prelude body moved by one live shadowing is compiled again when a later shadowing moves a call inside it 2026-09-25 22:51:02 +07:00
ccdadeeb6e A mark or a step spliced into a program that defines its own pause or step-point calls the prelude's 2026-09-25 22:34:28 +07:00
d07c7b4e2c A prelude function shadowed live keeps the prelude's own calls on the prelude's body, as a rebuild does 2026-09-25 22:28:58 +07:00
69eb11ce9b Return types read off the body and generic structs live together 2026-09-25 20:51:38 +07:00
f6384fdf38 Merge master into the generics lane 2026-09-25 20:03:34 +07:00
ad40123b25 Master's error recovery and return types read off the body live together, and two ways out of an inferred body that cannot share a type are refused with both named 2026-09-25 19:58:31 +07:00
ff88b9dad6 A defn whose return slot is _ (or a .fln fn with no arrow) takes its return type from its own body, recursion through such functions is refused by name, and a stale caller of one is told which line changed its type 2026-09-25 17:09:13 +07:00
4c336687ef Master's error recovery is merged, and the refusal memos are consulted only where a refusal is raised 2026-09-25 17:03:32 +07:00
2f321fd061 Merge master into the generics lane 2026-09-25 17:03:13 +07:00
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
fc6e2f7dfb The break window evaluates in a frame and steps through a function, and C-c C-c reports every error in the form
# Conflicts:
#	test/test_dev.ml
2026-09-25 16:52:32 +07:00
37938db7c2 A call through a failed local is not reported and a miscounted call's arguments are, eval-in-frame answers slotless frames and ended stops, flan dev links its own agent, and the daemon buffer colours only file:line:col diagnostics 2026-09-25 16:47:51 +07:00
83dc716133 A program's or a session's defn named as a macro shadows the macro for its calls, with the shadowing warning a prelude function gets 2026-09-25 16:32:49 +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
527da37633 An evaluated expression's module is unloaded when its only strings are literals or registry names, because a literal is a copy the process keeps 2026-09-25 15:57:40 +07:00
da9f21ddcd A form sent to the daemon is refused with every error in it, and an expression evaluated from the break buffer sees the stopped frame's locals 2026-09-25 15:33:23 +07:00
5646ae148e Merge master; an expression evaluated at a stop runs against a scratch temp arena that is wiped after it, and the program's own temp arena is never rolled back 2026-09-25 14:09:30 +07:00
a0a86d0b80 The temp allocator grows a block that outgrows its chunk, answers a formatted number with one bump allocation, poisons what a dev wipe releases, and is wiped after each expression run while parked 2026-09-25 13:47:00 +07:00
5a78cdd202 Merge master 2026-09-25 13:36:54 +07:00
d2f25a6e44 Merge branch 'master' into worktree-agent-a9288676abb278ffb 2026-09-25 13:35:10 +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
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
acec25f8a1 Merge master 2026-09-25 12:43:50 +07:00
1d219b526c Merge master into the typed class slots lane 2026-09-25 12:14:42 +07:00
e0af3c9b1d A method of update-instance-for-redefined-class runs on each instance as it migrates, and one that signals offers migrate-by-name 2026-09-25 11:55:40 +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
de8e00314b A string literal handed to a declare-c reaches C uncopied, and both backends write a NUL after every literal 2026-09-25 11:33:03 +07:00
9e26275f9b A quasiquote nests as SBCL's does, a match takes an enum, and until is a prelude macro 2026-09-25 11:27:14 +07:00
de26d6e625 ~~@xs splices an unquote per element, a session can call a macro an expansion defined, and an enum member cannot be named else 2026-09-25 11:24:27 +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
0a6ea7c32b A caller excused for going stale takes back the generic copies its failed check cached, and a package's stale callers are named at their own file and line 2026-09-25 10:51:44 +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
793b0eea9e A defn- is private to its module, the package's own macros may write calls to it, and the refusal names the fix 2026-09-25 08:55:37 +07:00
6fd456c0a2 A function declared with defn- is callable only from the files of its own package 2026-09-25 07:42:40 +07:00
45cc4d20e8 One file holds what five did
# Conflicts:
#	FIX.org
2026-09-21 21:07:40 +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
Joseph Ferano
a14a872a44 A form a macro splices through is reported on the line it was written on 2026-09-21 19:16:45 +07:00
0c711942f7 A thunk named for the order it was minted in is a different signature after a reorder
Three from a review of the commit before this one, and the first is a dev
loop defect.  Naming the widening thunk thick/<count so far> put traversal
order into a symbol, and Session.compatible compares a reload's functions
against the running program's by name -- so swapping two calls in a body
renamed nothing the programmer can see and reported "thick/0 changes
signature, from [i32] i32 to [i64] i64.  Restart to change it."  The name is
the signature again, written by thick_enc: every type self-delimiting, an
atom as its length and then its spelling, so the boundaries mangle_ty loses
are in the string rather than inferred from the separators.  mangle_ty is
untouched -- it is load-bearing for the instantiation names a backtrace, a
Reach edge and a dev cell show -- and the memo stays keyed on the types.
fn-thunk-reload.flan is the pair of widenings and test_session reorders them.

The second was a silent miscompile.  bind_ty's Fn-pattern-against-CFn-argument
arm was structural, so it matched nested function positions too, and the
catch-up pass that builds the thunk compares the whole substituted parameter
list -- false when the mismatch is inside one, and the fallthrough handed the
argument over unchanged: one word where the instance declares two, 255 on
both backends with nothing said anywhere.  The widening is a value the caller
builds around the whole argument and there is nowhere inside one to build it,
so the arm is admitted at the top of an argument's type and nowhere else, and
the catch-up arm is total over the pair rather than guarded -- bind_ty's
fallthrough is Types.fits, which admits Never, so a binding can still succeed
over a pair the two words cannot bridge.  fn-generic-nested.flan is the
parameter position and fn-generic-nested-return.flan the return one.

And the third closes the hole the escaping inversion was for.  A match arm
binds the case's fields to slots and the store that fills them is inside the
branch, not in any form escape_check reads as a binding, so (match o (Some f)
f ...) handed back through a name what a case-field read cannot hand back at
all -- sound only because Some_ denies suspects.  An arm's slots of function
type are suspect now, for the same reason the read itself is.
2026-09-21 15:44:28 +07:00