rx-to-stringlấy một hình thức regex làm đối số. Cú pháp giống như đối số của rx.
(rx-to-string '(or "foo" "bar"))
"\\(?:\\(?:bar\\|foo\\)\\)"
Những gì bạn đã cố gắng vượt qua không phải là một hình thức regex, mà là một danh sách các hình thức regex. Vì ý của bạn là chuỗi các biểu thức chính quy được symbol-starttheo sau bởi một chuỗi các chuỗi theo sau symbol-end, nên bạn cần phải dẫn đầu với toán tử trình tự sequence(có thể được viết tắt thành seqhoặc :, hoặc thậm chí kỳ lạ and).
(rx-to-string `(: symbol-start (or ,@strings) symbol-end))
"\\(?:\\_<\\(?:ba[rz]\\|foo\\)\\_>\\)"
rxthực tế là một trình bao bọc nhỏ xung quanh rx-to-stringhoạt động vào thời gian biên dịch vì nó là một macro. Điều làm cho điều này trở nên khó hiểu là nếu bạn truyền nhiều đối số cho rx, có một sequencetoán tử ẩn . Các tài liệu của rxcó thể đứng để được làm rõ.
(rx (: symbol-start (or "foo" "bar" "baz") symbol-end))
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"
(rx symbol-start (or "foo" "bar" "baz") symbol-end)
"\\_<\\(?:ba[rz]\\|foo\\)\\_>"