Size: a a a

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

2020 April 10

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ещё приходит в голову вариант let-образного макроса, чтобы использовать как (megamacro [db "monger-test" coll "documents"] code...)
источник

E

ETL in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
а есть пара примеров того, как оно выглядит без макроса?
(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (megamacro
  (if  (empty? (map #(get % :_id)  (mc/find-maps db coll)))
    0
    (apply max (map #(get % :_id) (mc/find-maps db coll))))))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
только мне вот что-то не очень нравится идея биндить локальные имена извне
то есть макросы fn и let тебе не нравятся?
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
Sergey Trofimov
то есть макросы fn и let тебе не нравятся?
там без этого никак
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (megamacro
  (if  (empty? (map #(get % :_id)  (mc/find-maps db coll)))
    0
    (apply max (map #(get % :_id) (mc/find-maps db coll))))))
нет, именно без megamacro
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
там без этого никак
ну дай пример популярных библиотек, где имена байндингов зашиты внутри макросов, а пользовательский код с ними работает.
чтобы понять, как это линтер понимает
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну дай пример популярных библиотек, где имена байндингов зашиты внутри макросов, а пользовательский код с ними работает.
чтобы понять, как это линтер понимает
ну вот я и хочу посмотреть, может быть в данном конкретном случае можно не так
источник

E

ETL in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
ну вот я и хочу посмотреть, может быть в данном конкретном случае можно не так
определенно можно, это просто я решил на макросе запилить ) про первое правило макросов - "никогда не писать макросов" в курсе, книга Грэхэма в списке отложенных )))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
ну вот я и хочу посмотреть, может быть в данном конкретном случае можно не так
в данном конкретном можно, у человека же макрос работает
но code наверняка выглядит магично, так как непонятно, откуда берутся conn и товарищи
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
Sergey Trofimov
в данном конкретном можно, у человека же макрос работает
но code наверняка выглядит магично, так как непонятно, откуда берутся conn и товарищи
вот именно
источник

E

ETL in Clojure — русскоговорящее сообщество
(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (let [connection (mg/connect)
      database   (mg/get-db ~connection "monger-test")
      coll "documents"]

  (if  (empty? (map #(get % :_id)  (mc/find-maps db coll)))
    0
    (apply max (map #(get % :_id) (mc/find-maps db coll))))))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
но этот вариант уже без такой магии https://t.me/clojure_ru/114240
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (let [connection (mg/connect)
      database   (mg/get-db ~connection "monger-test")
      coll "documents"]

  (if  (empty? (map #(get % :_id)  (mc/find-maps db coll)))
    0
    (apply max (map #(get % :_id) (mc/find-maps db coll))))))
а вот с coll я бы точно не стал  так делать
источник

E

ETL in Clojure — русскоговорящее сообщество
Вот если делать без макроса. Просто использование monger предполагает, что ты эту простыню с let пишешь при использовании функций из этой библиотеки каждый раз, т.е. оно пишется в somehow императивном стиле.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
Вот если делать без макроса. Просто использование monger предполагает, что ты эту простыню с let пишешь при использовании функций из этой библиотеки каждый раз, т.е. оно пишется в somehow императивном стиле.
доступ к conn нужен из кода?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
Вот если делать без макроса. Просто использование monger предполагает, что ты эту простыню с let пишешь при использовании функций из этой библиотеки каждый раз, т.е. оно пишется в somehow императивном стиле.
ну, мне мотивация изначально была понятна
источник

E

ETL in Clojure — русскоговорящее сообщество
coll это константа, я её в def могу пихнуть и потом квалифицированно использовать, если так лучше
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
coll это константа, я её в def могу пихнуть и потом квалифицированно использовать, если так лучше
я спрашиваю про conn, не путайся
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (let [connection (mg/connect)
      database   (mg/get-db ~connection "monger-test")
      coll "documents"]

  (if  (empty? (map #(get % :_id)  (mc/find-maps db coll)))
    0
    (apply max (map #(get % :_id) (mc/find-maps db coll))))))
(defmacro with-connection
 [body]
 `(let [connection (mg/connect)
        database   (mg/get-db ~connection "monger-test")
        coll "documents"]
    @body))

в первом приближении так
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
доступ к conn нужен из кода?
нет,  conn нигде за пределами вектора привязок let не используется
источник