rx-to-stringassume uma forma regexp como argumento. A sintaxe é igual ao argumento de rx.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
O que você tentou passar não é um formulário regexp, mas uma lista de formulários regexp. Como o que você quer dizer é a sequência de expressões regulares symbol-startseguida por uma de várias sequências seguidas por symbol-end, você precisa liderar com o operador de sequência sequence(que pode ser abreviado para seqou :, ou estranhamente até and).
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rxé de fato um pequeno invólucro rx-to-stringque funciona em tempo de compilação porque é uma macro. O que torna isso confuso é que, se você passar vários argumentos para rx, existe um sequenceoperador implícito . A documentação de rxpoderia ser esclarecida.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"