Size: a a a

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

2021 November 08

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Это для макросов и для тегов, не для обычных defn
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Чтобы после развертки макросов получить уже готовый список, что будет работать быстрее.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
на самом деле тело функции получается такое
(defn my-merge [head v1 v2]
 (apply vector (seq (concat (list head) v1 v2))))
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
тем, что это не работает
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
(macroexpand-1 (quote `[~head ~@v1 ~@v2]))
=>
(clojure.core/apply
clojure.core/vector
(clojure.core/seq (clojure.core/concat (clojure.core/list head) v1 v2)))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
как бы работает, иначе бы человек не спрашивал 😊
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
а что если в my-merge передется результат базы данных?
источник

A

Andrey in Clojure — русскоговорящее сообщество
Спасибо! Чё-то я крутился с раскрытием макроса, но правильно применить не додумался
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну так тоже работает, хотя и выглядит крипово
(macroexpand-1 '`[~head ~@v1 ~@v2])
=>
(clojure.core/apply
clojure.core/vector
(clojure.core/seq (clojure.core/concat (clojure.core/list head) v1 v2)))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
в общем, с into будет лучше
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
спасибо, тупанул!
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
(defn my-merge [head v1 v2]
 (into [head] cat [v1 v2]))
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Следующим шагом убрать отдельную функцию )
источник

A

Andrey in Clojure — русскоговорящее сообщество
Забавно, безобидный с виду `[] раскрывается в (apply vector (seq (concat)))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
подводные камни в том, что это менее читаемо. синтаксис с бектиком и тильдой нужен для того, чтобы нагенерить код по условию. А когда логика известна заранее, нужно писать обычный код
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
(defn my-merge-1 [head v1 v2]
 `[~head ~@v1 ~@v2])

(defn my-merge-2 [head v1 v2]
 (into [head] cat [v1 v2]))

(my-merge-1 14 [13 12] [11 10])                             ; Execution time mean : 941,402397 ns
(my-merge-2 14 [13 12] [11 10])                             ; Execution time mean : 269,109520 ns
источник

E

ETL in Clojure — русскоговорящее сообщество
не понимаю, почему post не заводится:

(defn boo [x]
 {:post [(fn [y] (:c y))]}
 (merge x {:k 5}))

(boo {:m 3})
=> {:m 3, :k 5}

в моём представлении - post есть вектор 1-арных функций, принимающих результат вычисления тела функции с аргументами и  возвращающих бул, ежели какая-либо из этих функций возвразает ложное значение - возбуждается эксепшен assert failed
у меня assert вроде однозначено failed - в итоговой мапке нет ключа :c, но вместо эксепшна мне приходит результат

ЧЯДНТ?
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
:post [(:c %)]
вот так надо
и :pre и :post это список выражений а не функций
источник

KC

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

E

ETL in Clojure — русскоговорящее сообщество
а какая фундаментальная разница между
#(:c %) и (fn [y] (:c y)) ,  никакой же:    

(macroexpand-1 '#(= % 5))
(fn* [p1__18055#] (= p1__18055# 5))

и да, так тоже не работает:
(defn boo [x]
 {:post [#(:c %)]}
 (merge x {:k 5}))

(boo {:m 3})
=> {:m 3, :k 5}
источник