Size: a a a

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

2019 June 28

MG

Mikhail Gusarov in Clojure — русскоговорящее сообщество
Ясн
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
так есть что-нибудь для хуков/декораторов в clojurescript? =)
источник

AG

Alexey Golda in Clojure — русскоговорящее сообщество
странно слышать вопрос о декораторах в clojure/script
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
так есть что-нибудь для хуков/декораторов в clojurescript? =)
А хуки на что тебя интересуют? Типа, какова цель?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
The2lb3oz4dr10½grOfHedgehogs
А хуки на что тебя интересуют? Типа, какова цель?
есть какая-то функция
я хочу ее расширить

например, логировать аргументы
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
есть какая-то функция
я хочу ее расширить

например, логировать аргументы
И то и другое это просто композиция функций
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Вызывать, правда, придется уже что-то другое, не оригинальное, но иначе это не фп подход
источник

MK

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

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
да, только имя у функции будет другое
а я хочу не менять имя, чтобы существующий код продолжал рабоать
Измени саму фукнцию тогда
источник

T

The2lb3oz4dr10½grOfHedgehogs in Clojure — русскоговорящее сообщество
Типа, это и есть декоратор, в питоне, например, он так и реализован: под именем фукнции регистрирует другую функцию, в которой он вызывает оригинал, отвязанный от его настоящего имени
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Или иди путём макросов а-ля трейсинг в`re-frame-10x`
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
да, только имя у функции будет другое
а я хочу не менять имя, чтобы существующий код продолжал рабоать
да, можете просто написать свой defn
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
или, кстати, воспользоваться хуками валидации
http://blog.fogus.me/2009/12/21/clojures-pre-and-post/
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
(defn constrained-fn [f x]
 {:pre  [(pos? x)]
  :post [(= % (* 2 x))]}
 (f x))
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
но comp предпочтительнее
источник

ИФ

Иван Федоров in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
так есть что-нибудь для хуков/декораторов в clojurescript? =)
а в чём задача?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Иван Федоров
а в чём задача?
предположим, есть типы/классы/рода значений/объектов/сущностей.
Например, публикация и ее потомки - интервью, статься, фотоотчет, …
Есть базовая функция валидации публикации.
Я хочу расширять ее для каждого типа.

Мультиметоды тут не подходят, т.к. полностью заменяют реализацию.
Можно использовать протоколы и их реализацию через метаданные (появилось в clojure 10)
и потом просто (vary-meta x update `pub/validation (fn [old] …)
но не понятно как такие значения сериализовывать и потом востанавливать, т.к. реализация функций потеряется.

или как вариант делать декораторы вроде
(alter-var-root #'agg/schema*
               (fn [f]
                 (fn [type]
                   (cond-> (f type)
                     (isa? type :agg/test)
                     (assoc :test-agg/many {:db/cardinality :db.cardinality/many})))))
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
но хочется завести это еще и на clojurescript
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
можно сделать мультами и кастомной иерархией
источник

IG

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