Be aware that using the [[ indexing operator on an object of class
expr_list discards information about whether that element of the list is
marked as anchored. In other words, if xl <- expr_list({.A}, ~{.A}),
then xl[[1]] and xl[[2]] are both equal to the "bare" symbol .A, so
the information that the second element of the list is anchored has been
lost. Consequently, in e.g. expr_match(expr, xl[[2]]), it will be as
though the tilde isn't there, and xl[[2]] will not just match with the top
level of expr as was probably intended. Use the [ operator instead,
which retains anchoring information; expr_match(expr, xl[2]) will work as
expected.
Note that when you replace part of an expr_list with another expr_list,
the anchoring information from the "replacement" expr_list is copied over,
while replacing part of an expr_list with an expression or a "plain" list
of expressions retains the existing anchoring information.