rx-to-string
toma una forma regexp como argumento. La sintaxis es la misma que el argumento de rx
.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
Lo que intentó pasar no es un formulario regexp, sino una lista de formularios regexp. Dado que lo que quiere decir es la secuencia de expresiones regulares symbol-start
seguidos por uno de un puñado de cadenas seguido de symbol-end
, es necesario conducir con el operador de secuencia sequence
(que se puede abreviar como seq
o :
, o incluso extrañamente and
).
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rx
De hecho, es un pequeño contenedor rx-to-string
que funciona en tiempo de compilación porque es una macro. Lo que hace que esto sea confuso es que si le pasas múltiples argumentos rx
, hay un sequence
operador implícito . La documentación de rx
podría ser aclarada.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"