- [x] Make a Stack project w/ the chosen dependencies - [x] Make sure they all resolve & build etc. - [x] Figure out what the initial minimal language will be? - [x] Make sure LLVM still works w/ the OrcJIT example - [x] ~~Figure out what a concrete syntax tree should look like as a Haskell type~~ ------- - [x] Write some types? - [x] Lex something - [x] Parse something - [x] Resolve names - [x] Typecheck something - [x] Translate to an IR (ANF w/ basic blocks & basic block args?) * BBs or EBBs? probably BBs for now to simplify translation to LLVM - [x] Generate some code - [x] Output a binary - [x] Make sure it actually runs & works ------- - [ ] Write tests for everything! http://teh.id.au/posts/2017/06/07/round-trip-property/index.html - [ ] Write pretty printers - [ ] AST - [x] IR - [ ] Error messages - [x] Write well-formedness validators - [x] Write a typechecker for the IR as well - [ ] Write an evaluator - [x] Write fizzbuzz - [x] Write a usable CLI - [x] Make it JIT - [ ] Go back and fix the fixable FIXMEs and TODOs - [ ] Write a README w/ overview > two types: Int, Bool > arithmetic and comparison operators > `if`, `while`; `forever`/`break`? > `let`, `var` > `read()`, `write()` > mutation (assignment) > no functions yet > Example program: > ``` > var n = 0 > forever { > write(n) > let m = read() > if m == 0 { > return > } > n = n + m > } > ```
Figure out what a concrete syntax tree should look like as a Haskell type