TODO Support: 1. Create Racket version of the nanopass framework 2. Extended to more R6RS libraries (at least if they support some form of compile time environment). Nanopass Annoyances: 1. Removal of patterns is too strict matching EXACTLY the variable names (see above example) This may not be bad, but without the error is a very rough edge. 2. Output forms need to match original language forms very closely, e.g. if we have: (define-language L over --- where (e in Expr (begin e0 ... e1) ---) ---) we cannot create the constructor: `(begin (set! ,x0 (var ,tmp*)) ...) because it sees this as a single form instead of a list. Being able to create a make-begin helper for this situation is helpful, but ultimately we'd like it to match broader forms and complain at compilation time if it cannot prove they are safe itself. The contortion we are instead forced to perform is: (let* ([expr* (map (lambda (x tmp) `(set! ,x (var ,tmp))) x0 tmp*)] [rexpr* (reverse expr*)] [last-expr (car rexpr*)] [expr* (reverse (cdr expr*))]) `(begin ,expr* ... ,last-expr)) Features to add down the road: 1. Pass fusing with deforestation of the intermediate passes. Error Handling/Loosening restrictions: 1. Fix parser to use positional information to report errors on the syntax error, in addition to reporting the error.