Sun Aug 16 12:43:45 CEST 2009
Now.. I think the bytecode does what I need it to do. But how to
compile it? This requires multiple passes to properly inline all
I have something like this:
symbol? YES -> dereference if possible
NO -> quote as datum
next? YES -> alloc SEQ and continue
NO -> store and finish
Then iterate over the data structure until all symbols are
There are (at least?) two special cases that won't work:
- empty programs are not handled properly.
- degenerate loops lead to infinite dereference passes:
Handling those separately should make it work though. First, filter
out all references to empty programs. Second: use a counter to
indicate the number of dereferences performed. If 0, there is no
progress: any remaining references are degenerate loops.
The empty program (NOP) is necessary as a corner case, because empty
quotations need to work. These can be optimized out of normal code
Hmm.. this approach has a number of pitfalls. It isn't possible to
determine whether a program is a NOP before completely compiling it.
Let's make it work first using a 1->1 map from source structure, and
perform optimizations in a second pass.
So, the passes are:
1. construct environment
2. compile s-expr -> AST (``improper'' SUB lists)
3. resolve all references
4. check degenerate loops (NI)
5. snap pointers (NI)
6. patch global environment (NI)
Most of the passes can be done purely. They don't create much garbage
so they can be kept as primitives (should make it to the end without
To test it, first the primitives need to be defined.
OK. Prims load + highlevel code compiles.