A quick follow-up: Perhaps this should be a lesson that trying to find a "pure" construct for a fundamentally side-effecting operation is a Bad Idea.
Fundamentally, extending ASDF is a global change that affects the whole running image. Pretending it is something else doesn't help anyone.
Now, if one wanted to have a build environment around a system build, and change only that local environment -- so that the build of the next ASDF system will occur in a pristine environment -- that might be possible.
If anyone wants to try to develop such a build system -- perhaps YASDF -- more power to 'em! But it won't be ASDF.
And maybe you should just be writing Haskell, instead ;-)
Cheers