SPEC.md— full technical specification, language subset, architecture.src/tacitj.ijs— top-level pipeline; the composition order is canonical.tests/runtests.ijs— test runner conventions and assertion macros.CHANGELOG.md— record notable changes when you commit a new feature.
- J interpreter: 9.7+ (Dyalog-compatible subset). Install with
brew install --cask jon macOS. SetJC=jconsole(or full path) in the Makefile environment if not on$PATH. - Tests are pure J: no Python, no JS, no shell parsing. Just
jconsole. - Use
make testto run the full suite. Usemake run EXAMPLE=examples/X.ijsfor one-shot smoke runs.
- Every
.ijsfile starts with a bannerNB. ===...block describing its role. - Public verbs are named in camelCase or J-style lowercase (
lex,parse,evalAst,compilePipeline). - Internal helpers are prefixed
_or kept private viaNB.comments. - Tacit pipelines (
f @ g @ h) are preferred at the composition level. Recursive-descent passes necessarily use explicit control. - Token / AST nodes are boxed triples:
(kind ; value ; meta).
- After editing any
src/*.ijs, runmake test. - After adding a new verb, add at least one assertion in the corresponding
tests/test_<module>.ijs. - Never commit secrets or absolute paths from the developer's machine into tests or examples.
- Don't add a self-host check that requires the parser to handle J-specific
syntax (3 : 0, =:, etc.) — the Stage 0 parser is a strict subset of J.
See
bootstrap/stage3_attempt.ijsfor the realistic baseline.
- Don't add dependencies. J 9.7 stdlib only.
- Don't change the token / AST node shape without updating all consumers and the spec.
- Don't introduce ad-hoc parser hacks; defer to the gerund-dispatch table in
parse.ijs. - Don't commit until the user asks.
<scope>: <imperative summary>
Examples: lex: handle doubled-quote escape, parser: add fork dispatch,
tests: cover negative numbers.