Подтвердить что ты не робот

Как написать макрос Clojure для создания регулярного выражения из строки?

Я создаю удобный макрос. Частью удобства является то, что регулярное выражение может быть задано только строкой, а не обозначением # "re".

Одна часть, которую я не могу понять, заключается в том, как заставить макрос взять String и переписать его как регулярное выражение Clojure (например, создать # "re" нотацию). Я думаю, что это проблема синтаксиса/экранирования.

Моя первая наивная попытка (притворяясь, что мне нужна только часть String-to-regex):

(defmacro mymac [mystr] `#~mystr)

Можно ли делать то, что я пытаюсь сделать? Или существует ли реальная функция, чтобы взять строку и создать регулярное выражение, вместо использования макроса # reader?

Или мне нужно просто перейти на Java и использовать java.util.regex.Pattern?

4b9b3361

Ответ 1

Для него есть функция: re-pattern

user=> (re-pattern "\\d+")
#"\d+"

Ответ 2

Объяснить немного больше:

#"" - это макрос читателя. Он разрешается читателем в режиме чтения. Таким образом, нет возможности создать макрос, который расширяется в макрос читателя, потому что фаза чтения давно ушла. Макрос возвращает фактическую структуру данных, представляющую расширенный код, а не строку, которая снова анализируется, например, например. #define работает в C.

Ответ

j-g-faustus - это правильный путь (tm), чтобы идти.

Ответ 3

Возможно, я не понимаю вопрос, но разве это не делает то, что вы хотите?

user=> (. java.util.regex.Pattern compile "mystr")
#"mystr"

Ответ 4

Чтобы согласовать строку дословно, игнорируя специальные символы:

(defn to-regex [some-string]
  (re-pattern (java.util.regex.Pattern/quote some-string)))

Тогда ... будет соответствовать только ..., а не aaa или любой другой комбинации трех букв.