jolt/.dirge/memory/MEMORY.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

1.9 KiB

defmacro supports optional docstring: (defmacro name [args] body) or (defmacro name \"doc\" [args] body). Implementation: slice rest-form from form index 2, check if first is string, adjust args-form and body start accordingly. Implicit &env binding injected as (put new-bindings "&env" @{'ns nil}) — must use @{} not (struct …) because nil values get dropped from structs. fn* uses same parse-arg-names helper for & rest args. § Jolt bootstrap: core-bindings (def- map) maps symbol strings → Janet functions. init-core! interns them into clojure.core ns. Macros (when, defn, declare) are registered in core-macro-names which returns @{"when" true "defn" true "declare" true}. init-core! checks this table and sets :macro true on the var for macro bindings. Order matters: core-when and core-defn must be defined BEFORE core-bindings map literal references them, otherwise compile error. § Reader comments (;) return {:jolt/type :jolt/skip} sentinel; parse-next/parse-string skip past it. Closing ), ], } produce explicit "Unmatched" errors. unwrap-meta-name recursively unwraps (with-meta sym meta) to raw symbol — used in def, ns, deftype, defmethod. resolve-sym does class-name lookup: Foo.Bar.Baz → ns "Foo.Bar" name "Baz". Janet (set [a b] tuple) doesn't work — use explicit indexing. comment must be a macro (registered in core-macro-names) to avoid evaluating body. § Sci bootstrap order: macros(4/4)→protocols(15/17)→utils(39/47)→types(22/27)→unrestrict(2/2)→vars(28/28)→lang(10/10)→ctx-store(6/6)→namespaces(93/98)→core(60/69). All .cljc; #?(:clj) resolved at read time, #?(:cljs)→nil. § Janet last works only on indexed types (tuple, array). On strings it returns nil. Use (s (- (length s) 1)) to get the last character of a string, or (string/slice s (- (length s) 1)) for the last char as string. (last "hello") → nil, not \o.