Size: a a a

Clojure — русскоговорящее сообщество

2020 November 08

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
вот такое я вернул из макроса {~@mappings ~@mappings}
да, странное, ведь в мапе справа и слева не должно быть одно и то же?
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
суть в том, что кложура не дает сделать {~@mappings}
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Выдает
Syntax error reading source at (REPL:22:26).
Map literal must contain an even number of forms
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
суть в том, что кложура не дает сделать {~@mappings}
ты весь код покажи
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ух, это сложно читать)
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Вот я принтовал mappings

("name" (.group G__3079 1) "surname" (.group G__3079 2))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
кодом дай
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Окай
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
(defmacro regex
 "Given an expression that returns a string returns a function
 that given a string returns nil if pattern did not match
 and a map of named groups if pattern matches."
 [regex-string-expression]
 (let [regex-string (eval regex-string-expression)
       re-group-regex #"(?<!\\)(?:\\\\)*\((?:\?<(\w+)>|[^?])"

       string-arg (gensym)
       matcher-arg (gensym)

       pattern (re-pattern regex-string)
       group-names (mapv second (re-seq re-group-regex regex-string))
       mappings (apply concat (map-indexed (fn [i group-name]
                                             `(~group-name (.group ~matcher-arg ~(inc i))))
                                           group-names))]
     `(fn [~string-arg]
        (let [~matcher-arg (re-matcher ~pattern ~string-arg)]
          (if (.matches ~matcher-arg)
            {~@mappings ~@mappings}
            nil)))))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
(defmacro regex
 "Given an expression that returns a string returns a function
 that given a string returns nil if pattern did not match
 and a map of named groups if pattern matches."
 [regex-string-expression]
 (let [regex-string (eval regex-string-expression)
       re-group-regex #"(?<!\\)(?:\\\\)*\((?:\?<(\w+)>|[^?])"

       string-arg (gensym)
       matcher-arg (gensym)

       pattern (re-pattern regex-string)
       group-names (mapv second (re-seq re-group-regex regex-string))
       mappings (apply concat (map-indexed (fn [i group-name]
                                             `(~group-name (.group ~matcher-arg ~(inc i))))
                                           group-names))]
     `(fn [~string-arg]
        (let [~matcher-arg (re-matcher ~pattern ~string-arg)]
          (if (.matches ~matcher-arg)
            {~@mappings ~@mappings}
            nil)))))
и тестовое выражение давай
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
((regex "(?<name>[a-zA-Z]+) (?<surname>[a-zA-Z]+)") "John Smith")
источник

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
у кого-то есть мнение насчёт paredit vs parinfer?
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
Иван Федоров
у кого-то есть мнение насчёт paredit vs parinfer?
мне паринфер больше покатил
источник

MP

Maxim Penzin in Clojure — русскоговорящее сообщество
ну то есть я редактирую текст как обычно, а он мне только скобочки закрывает
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
вот такое я вернул из макроса {~@mappings ~@mappings}
видимо какой-то хитрый финт в ридере литерала, что оно так работает
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Я ожидал, что будет ошибка)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
(defmacro regex
 "Given an expression that returns a string returns a function
 that given a string returns nil if pattern did not match
 and a map of named groups if pattern matches."
 [regex-string-expression]
 (let [regex-string (eval regex-string-expression)
       re-group-regex #"(?<!\\)(?:\\\\)*\((?:\?<(\w+)>|[^?])"

       string-arg (gensym)
       matcher-arg (gensym)

       pattern (re-pattern regex-string)
       group-names (mapv second (re-seq re-group-regex regex-string))
       mappings (apply concat (map-indexed (fn [i group-name]
                                             `(~group-name (.group ~matcher-arg ~(inc i))))
                                           group-names))]
     `(fn [~string-arg]
        (let [~matcher-arg (re-matcher ~pattern ~string-arg)]
          (if (.matches ~matcher-arg)
            {~@mappings ~@mappings}
            nil)))))
проверь на (set! *unchecked-math* :warn-on-boxed), там ворнинг в одном месте
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
проверь на (set! *unchecked-math* :warn-on-boxed), там ворнинг в одном месте
а, хотя это на этапе компиляции...
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Благодарю)
источник