Fork me on GitHub
#clojure-russia
<
2017-11-08
>
niquola10:11:32

multimethod as dispatch fn in other multimethod 🙂

igrishaev10:11:00

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

ažyliuk11:11:23

Мне кажется паттерн матчинг подойдет

ažyliuk11:11:39

накидывай туда только клозы и в нужном порядке их расставляй 🙂

misha11:11:01

чтобы открытая система получилась - мультиметод в мультиметоде; чтобы закрытая, можно в диспатч функции сделать сет "спец" версий, и возвращать [:osx] если версия "не специальная", или [:osx :1.2.3] если специальная. но тогда каждую новую версию надо в 2 местах добавлять будет. лучше уж тогда сразу cond огромный наверное

misha11:11:08

есть еще хак из кложадоков

misha11:11:02

мультиметод в мультиметоде должен быть проще всего: диспатчишь по [:os :ver], а в дефолтном обработчике диспатчишь на [:os], имплементишь [:os] обработчики 1 раз, и не трогаешь их потом, со временем дописывая только обработчики для [:os :ver]

igrishaev11:11:31

паттерн-матчинг это суть cond, хотелось бы м-методами

misha11:11:34

вроде и дерево, а вроде и не совсем

igrishaev11:11:00

спасибо, подумаю. в английском канале отписал такое решение: каждый раз когда получаешь мап, делать derive по версии

igrishaev11:11:50

тогда будет так

[:mac ::ANY] ==> any mac method
[:mac :11.22.33] ==> version specific mac method

misha11:11:00

ну так тебе нужно на каждую спец версию: 1) дописать обработчик 2) обновить иерархию

misha11:11:09

вместо просто (1)

igrishaev11:11:17

просто нужно вызывать (derive (:version data) ::ANY)

misha11:11:39

но тебе должно быть виднее какие там значения, и как ты ими будешь пользоваться

igrishaev11:11:06

тогда они будут валиться на ANY, но как только задекларить метод в версией, попадешь в него.

misha11:11:34

я бы не хотел позже пытаться всунуть версию типа 1.0.12 в иерархию под андроид, и обнаружить, что она уже под линухом есть например

igrishaev11:11:33

не понял последнюю реплику.

misha11:11:06

у тебя могут быть 2 оси с одинаковыми версиями

igrishaev11:11:17

я уточню, что у меня около 50 обработчиков, каждый второй различает что это за ОС. перелопачивать все не вариант.

misha11:11:30

иерархия, на сколько я понимаю, подразумевает уникальность парента

misha11:11:54

либо диспатчер не сумеет решить кого из парентов выбрать

igrishaev11:11:55

нет, мы говорим о разном. версия не связана с ОС.

misha11:11:30

тогда я не понимаю, какую иерархию ты строишь derive'ом

igrishaev11:11:46

если диспатчер отдает вектор, то по каждому делается isa? и берется тот вариант, где уровень ниже.

igrishaev11:11:46

derive нужен на версию. ты говоришь, что каждая версия — это потомок :version/any

misha11:11:51

"на слух" не совсем понял как вся конструкция будет выглядеть

igrishaev11:11:36

ну вот смотри

[:mac :version/any]
[:mac :1.2.3]

misha11:11:02

"каждая" - это каждая "специальная"? или "каждая-каждая"?

igrishaev11:11:22

если я сделаю (derive :1.2.3 :version/any), то попаду во второй вариант

misha11:11:54

скольким коллегам тебе надо будет объяснить как это работает? kappa

igrishaev11:11:48

давай не будем скатываться к вопросом в стиле “коньяк по утрам“.

misha11:11:43

я не понял еще как эту иерархию потом прицепить к мметодам, надо мануал почитать