Size: a a a

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

2021 June 11

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Было бы удобней поведение ракета
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
хз, я чот как-то не очень за консселлами страдаю, особенно не страдаю за работой с ними вручную, все эти cadadadadadadr, всё равно, что на ассемблере писать
источник

KJ

Karina Jovian in Clojure — русскоговорящее сообщество
А, или здесь речь только об этом?
источник

DF

Damir Farazetdinov in Clojure — русскоговорящее сообщество
Для кложи, где вектор иммутабельный, не нужно задавать типы элементов и есть деструктуризация, вектор вполне себе заменяет кортежи. Вводить отдельный синтаксис для кортежей нет необходимости.

В других языках (где есть кортежи) есть всякие условности, при которых разница между кортежем и массивом становится сколько-нибудь ощутимой.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
На примере хаскела хорошо видна разница:
https://dkalemis.wordpress.com/2014/02/06/tuples-vs-records-in-haskell
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Добрый день.
Подскажите: кажется простой юзкейс, но я что-то не могу вразуметь. Пытался найти по разным запросам похожий юзкейс/пример, но ничего не нашел. Есть канал (async/chan), с которого приходят сообщения (разного рода мапки). Этим мапки своим внешним видом и структурой отличаются. В зависимости от разных проверок (триггеров) будут вызываться события, связанные с их обработкой.
Как это элегантно завернуть?
Можно создать отдельную мапу триггеров

{:failed-payment (fn [{message}] 
 (and (spec/valid? ::payment message) (...)))
:success-payment (fn [{message}]
 (and (spec/valid? ::payment message) (...)))}
Но проблема очевидна уже на этом маленьком примере: если мапа плоская, возникает дупликация кода. Можно сделать ее древовидной:

{:payment (fn [message]
 {:default (spec/valid? ::payment message)
  :sucess (...)
  :failed (...)})}
И написать соответствующий обработчик. Так будет удобнее. Имена/идентификаторы у триггеров будет древовидные: [:payment :success]. События можно настраивать на обработку триггеров в разных комбинациях (and [:new-user] [:payment :sucess]) (псевдокод), и так далее.

Но мне кажется, что это очень часто встречающийся случай, потому должно быть "дефолтное" решение. Как бы вы хендлили?
источник

E

ETL in Clojure — русскоговорящее сообщество
Если это обработка в зависимости от значения, то есть мультиметоды.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Ну да, события у меня и так мультиметоды.
источник

IG

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

Г

Григорий in Clojure — русскоговорящее сообщество
То есть у меня отдельно триггеры (какие-то предикаты на входящих мапках с кейвордами (идентификаторами)) и события.
источник

Г

Григорий in Clojure — русскоговорящее сообщество
События по триггерам мультиметодами вызываются.
источник

IG

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

Г

Григорий in Clojure — русскоговорящее сообщество
а можно псевдокодик?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(defn dispatch [data]
 (cond
   (s/valid? ::spec/good-payment)
   :good-payment

   (s/valid? ::spec/failed-payment)
   :bad-payment

   ...))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(defmulti process-data dispatch)

(defmethod process-data :good-payment
 [data]
 ...
 )

(defmethod process-data :bad-payment
 [data]
 ...
 )
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
а чего просто не {::spec/good-payment  :good-payment}?, а диспатчить по ней
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
вдруг там еще предикаты какие-нибудь
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Ещё когда-то смотрел на https://github.com/weavejester/intentions
Возможно пригодится
источник

Г

Григорий in Clojure — русскоговорящее сообщество
спс, посмотрю.
источник

Г

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