Size: a a a

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

2020 November 08

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Т.е. насколько я понял, нельзя в макросе эвалить локальные переменные
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Проблема в том, что вот здесь я получаю Can't eval locals
ну оно и не может здесь работать, проблема-то не в эвале
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Т.е. насколько я понял, нельзя в макросе эвалить локальные переменные
ну поставь себя на место компилятора...
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну я догадываюсь, что я тут головой не слишком хорошо подумал)
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Есть вариант того же, вот такой
Ну вот в этой функции такое ощущение, что должна быть возможность это сделать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну я догадываюсь, что я тут головой не слишком хорошо подумал)
ну бывают такие фазы в написании кода, когда всё само собой получается и мозг отключается 😊
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Мне по идее же нужно в рантайме собрать функцию
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну вот в этой функции такое ощущение, что должна быть возможность это сделать
вернуть литерал?
есть
написать литерал ручками, статический 😊
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Что-то мне кажется, что мне нужно в макросе просто поменять defmacro на defn
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Что-то мне кажется, что мне нужно в макросе просто поменять defmacro на defn
ну-ну 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Что-то мне кажется, что мне нужно в макросе просто поменять defmacro на defn
сделай паузу, скушай твикс
источник

MB

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

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
((regex "(?<name>[a-zA-Z]+) (?<surname>[a-zA-Z]+)") "John Smith")
у меня это не работает, если «в макросе просто поменять defmacro на defn»
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну, нужно еще eval убрать для входного аргумента и сделать eval на форму выходящую
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Ну, нужно еще eval убрать для входного аргумента и сделать eval на форму выходящую
боюсь, что eval будет работать совсем медленно
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
(defn 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]
 (let [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 [^long i group-name]
                                             `(~group-name (.group ~matcher-arg ~(inc i))))
                                           group-names))]
     (eval `(fn [~string-arg]
              (let [~matcher-arg (re-matcher ~pattern ~string-arg)]
                (if (.matches ~matcher-arg)
                  {~@mappings ~@mappings}
                  nil))))))
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну у меня это в целом код, который выполняется один раз, поэтому мне нестрашно
источник

ST

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

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Ну, я бы мог все свое добро на макросах написать почти, но что-то не хочется)
источник

A

Alexander in Clojure — русскоговорящее сообщество
Anton Chikin
Лиспи интересный на бумаге но неудобный
Минусую
источник