jolt/.dirge/memory/PITFALLS.md
Yogthos ab7ff85816 Phase 3: Compile-aware loader, :compile? flag, compile-and-eval
- loader.janet: load-ns with compile? dispatch, compiled-cache, compiled?, clear-compiled-cache
- compiler.janet: compile-ast (Janet data structures for direct eval), compile-and-eval
- api.janet: compile-string, compile-file, eval-string dispatches to compile-and-eval when :compile? is true
- types.janet: :compile? flag and :compiled-cache table in context env
- Stateful forms (def, defmacro, ns, deftype, defmulti, defmethod) fall back to interpreter
- All 317 tests pass + 16 new Phase 3 tests
2026-06-02 15:24:28 -04:00

1 KiB

Janet LSP produces false positives on .janet files — it doesn't understand Janet syntax (thinks docstring lines are unresolved symbols, doesn't know declare-project/declare-source macros, etc.). These are pre-existing and should be ignored — they don't affect runtime correctness. § Janet (parse s) returns [symbol, error-position] for forms — e.g., (parse "(+ 1 2)") gives [+ 1], not a parsed tuple. For proper evaluation of special forms, must use the parser pipeline: parser/newparser/consumeparser/eofparser/produceeval. Without parser/eof, produce returns nil for simple forms like numbers. Janet's eval also doesn't support special forms natively in data structures — (eval [if true 1 2]) fails with "unknown symbol if". Must parse strings, not eval tuples. § When you need to mutate a local with set, use (var x nil) not (def x nil). def creates constants — (set ns-name ...) on a def fails with "cannot set constant". This hit us in loader.janet ns-name extraction loop.