Why Isn't NULL an Error in Quoted COMPOSE Slots?

COMPOSE has a great feature of being able to add quotes to the slot, by grafting the quotes that are on the slot onto the synthesized result. It adds onto existing quotes:

>> compose [field1: '(first [a]) field2: '(first [''b])]
== [field1: 'a field2: '''b]

You can also compose quasi-states, but only on things where it would be legal:

>> compose [field1: ~(first [a])~]  ; Note: making ~'b~ would be illegal
== [field1: ~a~]

But there's a bit of a quirk I am curious about...

Generally speaking, NULL gives you errors in COMPOSE as a safety measure:

>> compose [a (null) b]
** PANIC: ~null~: can't COMPOSE antiforms into BLOCK!

But I don't get this error on quoted slots. The "quoting" produces a quasiform:

>> compose [a '(null) b]
== [a ~null~ b]

This is inconsistent with the explanation of the distinction between QUOTE and LIFT, which says that quoting is supposed to give an error on antiforms... and you need to use LIFT:

>> quote null
** PANIC: Use LIFT instead of QUOTE if antiform lifting is intentional

>> lift null
== ~null~

Shouldn't you have to perform a LIFT inside the compose if that's what you meant?

>> compose [a (lift null) b]
== [a ~null~ b]

Do note that it's not doing a raw LIFT... it's doing LIFT DECAY, because it decays antiforms:

>> compose [a '(pack [1 2]) b]
== [a '1 b]  ; not [a ~['1 '2]~ b]

PACK!s shouldn't be composing as packs, but as the decayed values. We don't want it to be composing in quasi-errors instead of reporting them.

I considered having it be a refinement, like compose:antiform, however...

I Think I Like Reverse-Biasing The Safety

I don't know if I'd say it's inconsistent, given that COMPOSE is a dialect.... and the whole point of a dialect is to use the parts to be effective. A QUOTED! value doesn't necessarily have to have anything to do with QUOTE at all in a dialect. (It just happens to be strongly correlated with quoting here...)

Quasifying stable, decayed, antiforms is genuinely useful.

I guess the way I'd put it is: if you think the safety is important, don't put the quotes on the outside of the group. Put it inside:

>> compose [field1: (quote first [a]) field2: (quote expression-maybe-null)]
** Error: that expression turned out to be null

Quotes on the outside then becomes a power-user feature, and it does what a power user wants:

>> compose [field1: '(first [a]) field2: '(expression-maybe-null)]
== [field1: 'a field2: ~null~]