Backquote vs Kernel
If you look at Kernel source, you'll quickly see constructions that a Lisper or Schemer would immediately use backquote for, like:
(eval ($if (null?/1 bindings) (list* $let () body) (list $let (list (car bindings)) (list* $let* (cdr bindings) body))) env)
Quote and backquote are discouraged in Kernel. They tend to detach symbols from the environments they pertain to. They're not needed much, because in Kernel it's usually not neccessary to pass bare symbols around unevaluated.
But backquote is a lot more convenient than managing tree structure manually. It's more WYSIWYG. It lets you read and write something like:
(eval ($if (null?/1 bindings) ($` $let () . body) ($` $let (#unquote(car bindings)) ($let* (cdr bindings) . body))) env)
Can we have it both ways? Yes.
Is it possible to have a variation of backquote that only exposes the sort of things manual list construction exposes, forms that don't naturally include symbols?
Yes. For instance, one could construct a form as traditional backquote does and evaluate that form in the current environment, without exposing the quoted form. The result would usually be evaluated a second time.
That gives the right result, but some pieces of the sexp get evaluated early (the low-quoted pieces), some get evaluated late (but still internally). It works but it seems dodgy.
With an equivalent result, one could say that backquote internally builds a form that, when evalled, recovers the original structure of the tree, except that low-quoted pieces are copied literally. Then it evals that form. In this formulation, there are no new quoted parts even internally, and all evaluation wrt the current environment happens in the final stage of backquote.
Any new machinery needed? Not much.
The backquote itself can be just an operative. The existing primitives supply enough functionality. The one piece of new language machinery needed is a means to introduce the low quote without causing special cases.
This rules out using a combiner, because backquote doesn't ordinarily evaluate combiners until it has settled the form structure, and low quote must be seen before that.
So low quote needs to be something that backquote understands particularly, which implies a unique object defined with backquote. But we can't convey this object by the usual means of binding it and writing its symbol. The logic is similar to the above: We'd need to use it before we evalled it and found it was special.
So we need a special way to read this object, thus the "#unquote" above. And that's about it.