jolt/.dirge/memory/PITFALLS.md
Yogthos b20536d1e3 bootstrap: SCI core deps loading with 284/304 forms passing
reader: #?@ empty splice fix (nil→@[]), #? nil→:jolt/skip, map reader handles #_/#?@ in K/V
evaluator: unwrap-meta-name helper, deftype interns ->Name too, dot-suffix fix
core: comment/prefer-method stubs, *unchecked-math*/*clojure-version* dynamic vars
2026-06-01 23:24:13 -04:00

839 B

Janet apply requires a function/cfunction. When tables/structs are used as lookup maps (like deftype fields, multimethod dispatch tables), they get called via (get f key) not (apply f args). The evaluator's default call path checks (function? f) before apply, falling back to (get f (first args)) for single-arg table/struct calls. § Janet structs silently omit entries with nil values: (struct ;[:x nil :y 1]){:y 1}. The :x key is completely dropped from the struct, not just set to nil. Use @{} (mutable table) when map needs nil-valued entries. This caused the &env implicit binding to fail — (put new-bindings "&env" {'ns nil}) created a struct that became empty {}, so (:ns &env) failed with unknown method. Fix: use @{} table for bindings that may contain nil values, or use a non-nil sentinel.