flan-dev's start command proposed the last program it had started, so invoking it from a fresh project's buffer offered the previous project's file. It now proposes the buffer it was called from; restarting the previous program is what flan-dev-restart-program is for. Zeroing a fixed array wrote one typed store per element. Above 64 bytes that becomes a memset, which LLVM can lower as a bulk clear; below it the inline stores are still cheaper than a call. Outline's minor-mode map owned TAB in the lowering buffer, so the folding keys that buffer defines never ran. A buffer-local overriding map gives them back without touching Outline anywhere else. FIX.org collects the rough edges found while using the dev loop.
2.1 KiB
- Stuff I've found
- Why do I need to call flan-dev to open another window?
- I can't eval a toplevel defvar, need to eval-defun (C-c C-c)
- I can't eval a top level Vec
- The edn module seems to need a struct declaration, it should do both; go into a struct but also return a Map with Vecs and Sets when we don't provide a type
- defenum needs optional autoincrementing discriminants
- We need a javascript backend so we can reach the world
- We need to have C-style unions, maybe those are called defunion, and then sum types are defdata or deftype
Stuff I've found
Why do I need to call flan-dev to open another window?
let: flan: the program exited; restart flan dev
I can't eval a toplevel defvar, need to eval-defun (C-c C-c)
For Flan’s intended live-program workflow, C-x C-e on any complete top-level form should do the natural thing:
- expression → compile/run temporary thunk; print its value
- defn, defvar, defmacro, etc. → compile/install it; report what changed
The compiler already has both paths. The current split is an editor/UI artifact: C-x C-e is wired directly to eval-expr, while C-c C-c is wired to declaration reload. It is not a fundamental limitation.
A good fix would make C-x C-e context-aware: if the enclosing form is top-level, send it through the declaration evaluator; otherwise use expression evaluation. Then C-c C-c can remain a convenient explicit “reload this definition” alias, but not the only way defvar works.
I can't eval a top level Vec
slurp returns (Vec u8), an owning, move-only buffer. Flan currently forbids every move-only global because it has no global ownership/lifetime model: any function could read and free it, while ownership tracking only exists within one function.
For data that is fixed at build time, use an embedded immutable array instead:
(defconst the-data (embed "game-data.edn"))
That produces a fixed [u8], not a heap-owning Vec, so it can live globally. It also resolves relative to sand.flan.
If game-data.edn genuinely must be loaded at runtime, then today it has to be owned by a local—typically load it in main and pass it through the functions that need it. For a game-wide runtime-owned data asset, that is a missing language/runtime feature, not a bad use case on your part.