Now I have to implement string->symbol so that the reader will run.

So here's my thought.  I'll change symbols to be objects in memory,
consisting of a pointer to a string and a pointer to the next symbol.
There will be a compile-time alist similar to the one that keeps track
of global variables for this; we will emit the symbols at the end of
the compilation.  There's also a global label symbol_table that has a
pointer that points to the first symbol in the linked list.

This representation incidentally makes symbol->string fairly trivial.

string->symbol walks through the linked list until it finds a null
pointer or a symbol with the right string.  If it finds a null
pointer, it returns it.  Otherwise, it creates a new symbol and links
it into the head of the list.

So plan:
1. make a compile-time alist of symbol labels
2. emit them just as magic words at the end of the file
3. change symbols to be merely pointers to those things
4. add pointers to strings to the symbols
5. add symbol->string
6. add string->symbol
