rx-to-string
assume 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-start
seguida 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 seq
ou :
, 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-string
que 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 sequence
operador implícito . A documentação de rx
poderia 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\\)\\_>"