Size: a a a

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

2019 August 05

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
> А есть смысл загружать все неймспейсы на старте через tools.namespace?

не, так не надо. Во-первых, это очень не очевидно, что неймспейсами управляет некая либа, во-вторых, линтеры на это будут ругаться
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
а есть ли какой-то способ добавить существующему объекту новый протокол, чтоб не потерялись старые?

например: у меня есть некий протокол LogProto и я хочу его заимплементить для спек, так чтоб у полученых объектов были реализованы все протоколы спек + мой протокол

сейчас делаю через reify и руками проксирую вызовы функций на старый объект
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Имено объекту или типу?
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
именно объекту
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
там просто уже до меня много чего на reify сделано и надо хендлить и такие случаи
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
Mike Bohdan
а есть ли какой-то способ добавить существующему объекту новый протокол, чтоб не потерялись старые?

например: у меня есть некий протокол LogProto и я хочу его заимплементить для спек, так чтоб у полученых объектов были реализованы все протоколы спек + мой протокол

сейчас делаю через reify и руками проксирую вызовы функций на старый объект
сделай макрос!
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Andrew Rudenko
сделай макрос!
Делаю уже. Тут проблема как задетектить все протоколы и интерфейсы объекта.
источник

MB

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

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
нууу, можно через рефлексию конечно, но я б не стал и меньше магию все же пихал
источник

AR

Andrew Rudenko in Clojure — русскоговорящее сообщество
типа указывать макросу для каких протоколов сгенернуть прокси методы
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Mike Bohdan
именно объекту
если объект умеет хранить метаданные, то можно в clojure 1.10 использовать опцию для протоколов extend-via-metadata
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
если ты это делашь через reify, то нужно добавить имплементацию IMeta или IObj
источник

MK

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

MK

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

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
если объект умеет хранить метаданные, то можно в clojure 1.10 использовать опцию для протоколов extend-via-metadata
зачастую это объекты что-то типа clojure.spec.alpha$map_spec_impl$reify__1997
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
а ты можешь переписать код их создания?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
и добавить туда реализацию IObj
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
могу, но тогда я заставлю пользоваться моими макросами/функциями вместо спековских
источник

MB

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

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
пока что из предложенного мне рефлексия больше всего нравится – осталось только разобраться как ее использовать
источник