If you have a tree that's almost perfect, but you just need to, uh, "fix it up" a little, that's where this fix-me-now macro can be your friend.
It's a combination of strse* from the strse egg and pre-post-order-splice* from sxml-transforms.
The first argument is the tree you wanna fix, followed by zero or more matches and replacements (so an even number), followed by zero or one alist of tags and bindings.
The match and replacement works like strse* while the bindings use pre-post-order-splice* but has sane defaults for *default* and *text* (which you can still override).
(fix-me-now '(and (she buying) 1 stairway 2 heaven) "2 h" "to h" `((she . ,(fn (cons* x 'is y)))))
⇒ (and (she is buying) 1 stairway to heaven)
(fix-me-now '(a (b c (d e f))) "e f" "(e f)")
⇒ (a (b c (d (e f))))
Note that if you use any strse* operators, the tree will be written and re-read using write semantics, which will mess up any procedures and stuff you have in there. If you only use the pre-post-order-splice* binding alist, you don't need to worry about that.
git clone https://idiomdrottning.org/fix-me-now