The layers of code semantics:
- Plain text - any valid unicode string, completely unvalidated
- Text tokens - whitespace-separated “tokens”, completely unvalidated
- Source token - “language framed” atoms of meaning, all valid syntax but semantically unvalidated and with no names resolved (this is maybe what you would share and collaborate on as a source code repository?, but you also need to resolve names)
- Symbol - a symbol really should be everything you need to link to that code from other code, which means that all names are resolved to hashes, but that macros also have parameter info available; a routine will just be linked for loading directly at run time, but a macro is a compile time tool; routines can be in a near-final byte code, but macros are instructions for the compiler not the processor