git » homepage.git » commit 4dd4dd2

Credit Proteus in the mutable-locals related work

author Alan Dipert
2026-11-12 14:33:33 UTC
committer Alan Dipert
2026-11-12 14:33:33 UTC
parent 50c718ea1fc93eb0741dae1d58cac3d7a5ef1f9d

Credit Proteus in the mutable-locals related work

md/Lisp/MutableLocals.md +2 -0

diff --git a/md/Lisp/MutableLocals.md b/md/Lisp/MutableLocals.md
index 4ba1de0..eb37e0c 100644
--- a/md/Lisp/MutableLocals.md
+++ b/md/Lisp/MutableLocals.md
@@ -187,6 +187,8 @@ To think, all this time, mutation was sitting inside `recur`, wearing a little h
 
 ## Appendix: Related implementations
 
+Zach Tellman’s [Proteus](https://github.com/ztellman/proteus) also provides mutable locals through `let-mutable` and `set!`. It stores them in small Java objects with mutable fields, including primitive fields for longs and doubles, so it can avoid numeric boxing too. Blacktide instead transforms the control flow, carrying updated values through lexical bindings and `recur`.
+
 Truth be told, this isn't my first rodeo. [HyperTURBO](https://github.com/alandipert/hyperturbo) is my earlier BASIC-inspired Clojure macro. Each numbered line becomes a function; an atom holds the program counter and variables. `GOTO` updates that counter, which the dispatcher consults after the line's function returns. Line numbers included at no extra charge.
 
 To interrupt a function before it returns, you can throw something. [flambard/tagbody](https://github.com/flambard/tagbody) uses this to implement Common Lisp-style `tagbody`: a sequence of forms with labels you can jump to. Its [implementation](https://github.com/flambard/tagbody/blob/05352cd75cc218814cd98c3676f8cac26b0fe4e9/src/tagbody/core.clj) puts each tagged section in a function. `goto` throws a custom `Throwable` carrying the destination; the dispatcher catches it and resumes there.