It feels to me that "symbolic assembly" is simply creating an AST for the low-level target, instead of just stopping the use of ASTs in the intermediate forms. The larger projects out there might not necessarily go in that direction, but this is very common in smaller utilities that focus on handling byte/vm/machine code.
I could be missing something, but that seems like the TL;DR to me. Once you have easy AST nodes representing the lowest output level, it's simple to manipulate, especially in a Lisp-derived language (which is always a plus in metaprogramming).
This kind of use of the CLR makes me more excited about having to learn C# for my internship this summer. (Not saying CLR is lame, but it's not as hot and radical as newer language communities IMO).
I could be missing something, but that seems like the TL;DR to me. Once you have easy AST nodes representing the lowest output level, it's simple to manipulate, especially in a Lisp-derived language (which is always a plus in metaprogramming).