multimethod as dispatch fn in other multimethod 🙂
так деревья начнутся, а мне бы линейную структуру. но я кое-что придумал.
Мне кажется паттерн матчинг подойдет
накидывай туда только клозы и в нужном порядке их расставляй 🙂
чтобы открытая система получилась - мультиметод в мультиметоде;
чтобы закрытая, можно в диспатч функции сделать сет "спец" версий, и возвращать [:osx]
если версия "не специальная", или [:osx :1.2.3]
если специальная. но тогда каждую новую версию надо в 2 местах добавлять будет. лучше уж тогда сразу cond
огромный наверное
есть еще хак из кложадоков
https://clojuredocs.org/clojure.core/defmulti#example-57558046e4b0bafd3e2a0474
мультиметод в мультиметоде должен быть проще всего: диспатчишь по [:os :ver]
, а в дефолтном обработчике диспатчишь на [:os]
, имплементишь [:os]
обработчики 1 раз, и не трогаешь их потом, со временем дописывая только обработчики для [:os :ver]
паттерн-матчинг это суть cond, хотелось бы м-методами
вроде и дерево, а вроде и не совсем
спасибо, подумаю. в английском канале отписал такое решение: каждый раз когда получаешь мап, делать derive по версии
тогда будет так
[:mac ::ANY] ==> any mac method
[:mac :11.22.33] ==> version specific mac method
ну так тебе нужно на каждую спец версию: 1) дописать обработчик 2) обновить иерархию
вместо просто (1)
просто нужно вызывать (derive (:version data) ::ANY)
но тебе должно быть виднее какие там значения, и как ты ими будешь пользоваться
тогда они будут валиться на ANY, но как только задекларить метод в версией, попадешь в него.
я бы не хотел позже пытаться всунуть версию типа 1.0.12 в иерархию под андроид, и обнаружить, что она уже под линухом есть например
не понял последнюю реплику.
1сек
у тебя могут быть 2 оси с одинаковыми версиями
я уточню, что у меня около 50 обработчиков, каждый второй различает что это за ОС. перелопачивать все не вариант.
иерархия, на сколько я понимаю, подразумевает уникальность парента
либо диспатчер не сумеет решить кого из парентов выбрать
нет, мы говорим о разном. версия не связана с ОС.
тогда я не понимаю, какую иерархию ты строишь derive'ом
если диспатчер отдает вектор, то по каждому делается isa? и берется тот вариант, где уровень ниже.
derive нужен на версию. ты говоришь, что каждая версия — это потомок :version/any
"на слух" не совсем понял как вся конструкция будет выглядеть
ну вот смотри
[:mac :version/any]
[:mac :1.2.3]
"каждая" - это каждая "специальная"? или "каждая-каждая"?
если я сделаю (derive :1.2.3 :version/any)
, то попаду во второй вариант
скольким коллегам тебе надо будет объяснить как это работает? :kappa:
давай не будем скатываться к вопросом в стиле “коньяк по утрам“.
я не понял еще как эту иерархию потом прицепить к мметодам, надо мануал почитать