Phase 3: Var system — var-get, var-set, var?, alter-var-root, find-var, alter-meta!, reset-meta!

- types.janet: find-var (ctx-based var resolution), alter-meta!, reset-meta!
- evaluator.janet: 10 new special-form dispatch arms for var ops
- core.janet: 6 new Clojure-level wrappers in core-bindings
- core-meta: add var-aware branch (was struct-only)
- core-binding macro: use array-map instead of hash-map (PHM incompatibility)
- 8 new tests (17: var system, 18: var metadata) — all pass
- 317 total tests, 0 failures
This commit is contained in:
Yogthos 2026-06-02 20:43:24 -04:00
parent ad895945a0
commit 8e86c7c2ec
8 changed files with 177 additions and 51 deletions

View file

@ -250,3 +250,38 @@
(print " passed")
(print "\nAll Phase 1 tests passed!")
# ============================================================
# 17. Phase 3: Var system completion
# ============================================================
(print "17: var system...")
(use ../src/jolt/api)
(let [ctx (init)]
(eval-string ctx "(def x-var-test 42)")
(assert (= true (eval-string ctx "(var? (var x-var-test))")) "var?")
(eval-string ctx "(def y-var-test 99)")
(assert (= 99 (eval-string ctx "(var-get (var y-var-test))")) "var-get")
(eval-string ctx "(def z-var-test 10)")
(assert (= 20 (eval-string ctx "(do (var-set (var z-var-test) 20) (var-get (var z-var-test)))")) "var-set")
(eval-string ctx "(def a-var-test 1)")
(assert (= 2 (eval-string ctx "(do (alter-var-root (var a-var-test) inc) (var-get (var a-var-test)))")) "alter-var-root")
(eval-string ctx "(def fv-var-test :found)")
(assert (= :found (eval-string ctx "(var-get (find-var 'fv-var-test))")) "find-var")
(eval-string ctx "(def ^:dynamic *dv* 1)")
(assert (= 99 (eval-string ctx "(binding [*dv* 99] *dv*)")) "dynamic binding"))
(print " passed")
# ============================================================
# 18. Phase 3: Var metadata
# ============================================================
(print "18: var metadata...")
(let [ctx (init)]
(eval-string ctx "(def mvar 42)")
(eval-string ctx "(alter-meta! (var mvar) assoc :doc \"the answer\")")
(assert (= "the answer" (eval-string ctx "(:doc (meta (var mvar)))")) "alter-meta!")
(eval-string ctx "(reset-meta! (var mvar) {:a 1})")
(assert (= 1 (eval-string ctx "(:a (meta (var mvar)))")) "reset-meta!"))
(print " passed")
(print "\nAll Phase 3 tests passed!")