Rewrite persistent_hash_map.clj with correct paren balancing. BitmapIndexedNode constructor + bit-or verified working in isolation. Core HAMT operations (bmn-assoc, bmn-find, phm-assoc, phm-get, phm-contains?, hash-map) structurally correct. Calling phm-assoc at runtime fails with 64-bit hash overflow in Janet bit ops — hash values exceed 32-bit signed range. Fix: wrap (hash key) with (bit-and (int h) 0x7FFFFFFF) in phm-assoc.
1.3 KiB
Janet (try body ([err] handler)) form: the handler clause takes exactly ONE parenthesized expression. (try (do ... :ok) ([err] (printf \"%q\" err) :fail)) is valid — the handler returns :fail. But (try (do ... :ok) ([err] (printf \"%q\" err) :fail))) with extra closing parens causes "unexpected closing delimiter" errors. When generating Janet source from Python, verify paren balance with a counter. Also: (def result (try ... ([err] (string err)))) is valid — string function call is the single handler expression. Getting this wrong wastes many iterations.
§
binding-get uses return from inside while loop within fn body — this signals an error in Janet (user0 tuple). Must use (var result :jolt/not-found) + (when (in t name) (set result ...) (set t nil) (break)) pattern. Cannot use return for early exit from loops in Janet.
§
Janet struct? returns false for tables. Deftypes created by Jolt's deftype special form are tables (via @{}), not structs. So (struct? val) fails for deftype instances but (get val :jolt/deftype) works. This broke instance? check for persistent vector — fixed by changing from (and (struct? val) ...) to (get val :jolt/deftype). The . special form for deftype field access strips - prefix: (.-cnt obj) → (get obj :cnt).