`(mloc (con ,con)
(val (cp (part ,actor)))
The (con ...) subtree has to be freshly allocated because ,con is inserted into it. The (val ...) subtree has to be new because (cp ...) has to be new because (part ...) has to be new because ,actor is inserted into it. And so the (mloc ...) tree has to be new because (con ...) and (cp ...) are new.The only static structure in this backquote are the symbols themselves.
If an evaluation of a backquote produces (1 2 3) and another evaluation of the same backquote produces (1 4 5), and no destructive splicing operators are used, these outputs cannot share list structure with each other or the template. This is because none of their corresponding structural parts are similar under any equality function.
How about if the substitutions are the same? Can we have (eq (mloc x y) (mloc x y))? I'm afraid not; for that to work for any x y pair, the function would have to be memoized. I don't know of any Lisp that automatically memoizes functions. (That would be a bad idea to do for any functions for which the programmer didn't explicitly request memoization.)
It could be done in situations when x and y are constants, like (mloc 'a 1), through a combination of aggressive inlining and backquote optimization. For that to work, backquote would have to be expanded after function inlining (a very curious architecture, indeed) so that the effects of propagation of the constants from the call sites into the function body would be visible to the backquote expander. Many CL implementations of backquote expand it at read time. Those which do it later have a backquote macro, which gets fully processed before any compilation takes place where inlining code transformations may happen.
I don't think that such liberties are implied by 2.4.6. The obvious intent is that pieces of the template structure, in particular tails of lists at any level, can be used like constants. The outputs of multiple evaluations of `(,arg a b c) can obviously share the (a b c) part. They cannot share the ,arg part, unless arg has the shape of a constant visible to backquote like for instance 'whatever. That is to say, `(,'X a b c) can be transformed by backquote into (QUOTE (X A B C)): backquote can recognize the ,(QUOTE X) and treat it as if it were X.
Original:
New, improved: