You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

49 lines
1.4 KiB
Plaintext

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.