Size: a a a

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

2019 August 05

MK

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

reify создает класс, просто ты не знаешь какой.
если у тебя есть объект, то ты можешь у него узнать класс и расширить этот класс протоколом

только при изменении кода создания объекта будет меняться имя класса и придется еще раз запускать код расширения
источник

MB

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

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
user> (def x (reify ))
#'user/x
user> x
#object[user$reify__18893 0x555a4e7 "user$reify__18893@555a4e7"]
user> (class x)
user$reify__18893
user> (defprotocol P (foo [_]))
P
user> (extend (class x) P {:foo (fn [_] (prn :foo))})
nil
user> (foo x)
:foo
nil
user>
источник

MK

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

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
(defn x [] (reify))
источник

MB

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

MK

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

MK

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

MB

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

MK

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

MB

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

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
что-то вроде (defmethod foo identity)
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
можешь код с reify показать?
там ничего интересного просто для одного ключа спеки одна реализация, а для другого – другая, т.к. они описывают разные вещи, хотя по сути оба являются мапкой, к примеру
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
(defn x [ctx]
 (reify ...))

(def obj1 (x :foo))
(def obj2 (x :bar))

;; ~~~~~~~~~~~~~~~~

(defn ->obj1 []
 (reify ...))

(defn ->obj2 []
 (reify ...))

(def obj1 (->obj1))
(def obj2 (->obj2))
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
у тебя первый или второй случай?
источник

MB

Mike Bohdan in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
(defn x [ctx]
 (reify ...))

(def obj1 (x :foo))
(def obj2 (x :bar))

;; ~~~~~~~~~~~~~~~~

(defn ->obj1 []
 (reify ...))

(defn ->obj2 []
 (reify ...))

(def obj1 (->obj1))
(def obj2 (->obj2))
1
источник

MK

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

MK

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

MK

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

MB

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