Work in progress: it builds and the runtime is exercised and green, but no Flan program can reach it yet — the checker half is not written, so (Map K V) is still refused where it is resolved. runtime/flan_rt.c is Odin's map, followed deliberately: open-addressed Robin Hood hashing at a 75% load factor, cache-line cell packing so no key or value straddles a line, and the probe loop kept to pointer-width integers. One type-erased runtime over (key size, value size) plus a hash and equality pair, the same arrangement the Vec runtime has over (size, align). Two departures from Odin, both deliberate and both commented where they are made. There are no tombstones, because removal is deferred by spec-memory.md, and that deletes the backward-shift loop entirely — it is the single largest reason this is shorter than the original. And the header does not stuff log2cap into the low bits of the data pointer: Odin does that because Raw_Map must be three words, whereas this header already carries an allocator, a generation and an epoch, so the tagging would buy nothing, cost a mask on every access, and make correctness depend on the block being 64-byte aligned rather than merely faster when it is. The scaffolding around it: a Map is 48 bytes and six words like a Vec, it crosses to the runtime by address because it is move-only and must be mutated in place, and it has a DWARF type showing all six fields. Tast.FnAddr is new — the address of a function, either one this compiler emitted or a runtime C symbol. It is not a function value: nothing in the surface language can produce one, name its type or call through it. Odin's Map_Info reaches its hash and equality pair exactly this way. reach.ml learns that edge, because a function reached only by address is invisible to the reachability walk otherwise, which is the same hazard handler-bind clauses already had. The hash and equality pair carries the transfer channel as its last parameter, because a pair emitted for a struct key is an ordinary Flan function and every Flan function's signature ends with one.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%