Instrumenting with pause, and the source locations that make it not a pure Emacs job
This commit is contained in:
parent
66c29dfa5f
commit
46b3080eda
30
DISCUSS.md
30
DISCUSS.md
@ -314,3 +314,33 @@ literal and not a map with symbol keys. Those get written on purpose.
|
|||||||
Deriving at runtime stays rejected — it would add an external dependency to a mode that ships inside this repo and
|
Deriving at runtime stays rejected — it would add an external dependency to a mode that ships inside this repo and
|
||||||
currently needs nothing beyond stock Emacs, and that community is mid-transition to a tree-sitter mode, so the base is
|
currently needs nothing beyond stock Emacs, and that community is mid-transition to a tree-sitter mode, so the base is
|
||||||
moving.
|
moving.
|
||||||
|
|
||||||
|
## 9. Instrumenting with `(pause)` from Emacs, without editing the buffer
|
||||||
|
|
||||||
|
Requested, not scheduled. The Clojure model: `C-u` before an eval marks the form so it stops when it runs. Wanted here
|
||||||
|
for **three targets** — the top-level form, the last expression, and **the form point is inside**, so that with the
|
||||||
|
cursor at `(+ 1| 1)` the program stops at that `(+ ...)`.
|
||||||
|
|
||||||
|
**What already exists, so this is mostly assembly:**
|
||||||
|
|
||||||
|
- **`(pause)` itself**, landed today in `lib/prelude.ml`. It is `error` under a `restart-case` with a `continue`
|
||||||
|
clause — a breakpoint is not a compiler feature here, it is what a condition system already gives you. Taking
|
||||||
|
`continue` resumes at the call.
|
||||||
|
- **`flan-eval-defun`** takes the top-level form's bounds and sends the text; **`flan-eval-last-sexp`** sends the sexp
|
||||||
|
before point. Both hand a *string* to the daemon, which is the hook — the buffer never has to be modified.
|
||||||
|
- **`flan-dev--enclosing-head`** (`flan-dev.el:1009`) already walks out to the enclosing form to find its head, for
|
||||||
|
eldoc. The third target's hard part is already written.
|
||||||
|
- `current-prefix-arg` is already read in one place (`flan-dev.el:1429`), so the `C-u` convention has precedent.
|
||||||
|
|
||||||
|
**So the work is a source-to-source rewrite in Emacs before sending:** find the target form's bounds, send the
|
||||||
|
top-level form with that span replaced by `(do (pause) <span>)`. Nothing on the compiler side changes.
|
||||||
|
|
||||||
|
**The one real difficulty: source locations.** Splicing text shifts every line and column after the insertion, so
|
||||||
|
error overlays, `layout`, the break loop's frame locations and DWARF would all point slightly wrong for an
|
||||||
|
instrumented form. Options, none free: pad the inserted text to preserve offsets (ugly, fragile across newlines); send
|
||||||
|
the instrumentation as a separate field the daemon splices *after* parsing, where locations are already attached; or
|
||||||
|
accept the drift and say so. **The second is almost certainly right** and makes this a small daemon change rather than
|
||||||
|
a pure-Emacs one — which also means it should not be built as a pure-Emacs hack first.
|
||||||
|
|
||||||
|
Worth deciding at the same time: whether an instrumented eval should also *stick* — Clojure's marks the var until
|
||||||
|
re-evaluated plainly — or whether it applies once.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user