Size: a a a

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

2020 April 10

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
хотя повторюсь, coll в let-е не нужен, можно просто врапнуть частично применить (mc/find-maps db coll) справа
источник

E

ETL in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
хотя повторюсь, coll в let-е не нужен, можно просто врапнуть частично применить (mc/find-maps db coll) справа
все так, его можно (def coll "documents") сделать.
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
все так, его можно (def coll "documents") сделать.
ну или так, да
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
нет,  conn нигде за пределами вектора привязок let не используется
ну тогда я за такой вариант
(defmacro megamacro
 [[db, coll] code]
 `(let [conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
    ~code))

(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (megamacro [db coll]
   (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 — русскоговорящее сообщество
Sergey Trofimov
ну тогда я за такой вариант
(defmacro megamacro
 [[db, coll] code]
 `(let [conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
    ~code))

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

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
норм! только я бы назвал with-*, чтобы по традициям
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну тогда я за такой вариант
(defmacro megamacro
 [[db, coll] code]
 `(let [conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
    ~code))

(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (megamacro [db coll]
   (if (empty? (map #(get % :_id) (mc/find-maps db coll)))
     0
     (apply max (map #(get % :_id) (mc/find-maps db coll))))))
а можно сделать в let стиле, чтобы из кода явно задавать строковые значения
источник

E

ETL in Clojure — русскоговорящее сообщество
Не понимаю, зачем мы используем генерацию символа вот здесь, если conn находится в локальной видимости выражения let?  

[conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну тогда я за такой вариант
(defmacro megamacro
 [[db, coll] code]
 `(let [conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
    ~code))

(defn set-counter-2
 "Присваиваем id значение самого большого id в базе"
 []
 (megamacro [db coll]
   (if (empty? (map #(get % :_id) (mc/find-maps db coll)))
     0
     (apply max (map #(get % :_id) (mc/find-maps db coll))))))
что-то усложнили с этим conn
(defmacro megamacro
 [[db, coll] code]
 `(let [~db (mg/get-db (mg/connect) "monger-test")
        ~coll "documents"]
    ~code))
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
что-то усложнили с этим conn
(defmacro megamacro
 [[db, coll] code]
 `(let [~db (mg/get-db (mg/connect) "monger-test")
        ~coll "documents"]
    ~code))
Да, так логичнее, согласен. conn это просто идиома из доки к monger, почему-то они везде этот conn пишут.
источник

ST

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

[conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
у тебя этого выражения не видно там, где ты используешь макрос
источник

E

ETL in Clojure — русскоговорящее сообщество
Sergey Trofimov
у тебя этого выражения не видно там, где ты используешь макрос
С-стиль )
источник

ST

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

[conn# (mg/connect)
        ~db (mg/get-db conn# "monger-test")
        ~coll "documents"]
  (megamacro [db coll]
   (if (empty? (map #(get % :_id) (mc/find-maps db coll)))
     0
     (apply max (map #(get % :_id) (mc/find-maps db coll)))))

 (megamacro
   (if (empty? (map #(get % :_id) (mc/find-maps db coll)))
     0
     (apply max (map #(get % :_id) (mc/find-maps db coll)))))


в первом случае у тебя имена объявлены явно там, где они будут использоваться

во втором их возникновение непонятно
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
С-стиль )
слушай, а ещё такой вопрос, где фигурирует database ?
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
а то в let-е в биндингах он есть, а внутри let-а я его не вижу
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
слушай, а ещё такой вопрос, где фигурирует database ?
в коде, db
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
запутал :)
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
тогда эта, макросы тут нафиг не нужны
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
в одной елочке и кружке пива запутали 😊
источник

DL

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