rx-to-string
przyjmuje formę wyrażenia regularnego jako argument. Składnia jest taka sama jak argument rx
.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
To, co próbowałeś przekazać, to nie forma wyrażenia regularnego, ale lista formularzy wyrażeń regularnych. Ponieważ to, co masz na myśli jest ciągiem wyrażeń regularnych symbol-start
następnie jeden pęczek ciągów następnie symbol-end
, trzeba prowadzić z operatorem sekwencji sequence
(które można w skrócie seq
lub :
, lub nawet dziwnie and
).
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rx
to tak naprawdę małe opakowanie, rx-to-string
które działa w czasie kompilacji, ponieważ jest makrem. Co sprawia, że to mylące jest to, że jeśli przekazujesz wiele argumentów rx
, istnieje domyślny sequence
operator. Dokumentacja rx
może być wyjaśniona.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"