clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
igrishaev 2017-11-08T09:03:22.000004Z

nicola 2017-11-08T10:12:32.000172Z

multimethod as dispatch fn in other multimethod 🙂

igrishaev 2017-11-08T10:18:00.000008Z

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

ažyliuk 2017-11-08T11:04:23.000181Z

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

ažyliuk 2017-11-08T11:04:39.000136Z

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

misha 2017-11-08T11:26:01.000002Z

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

misha 2017-11-08T11:26:08.000259Z

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

misha 2017-11-08T11:31:02.000332Z

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

igrishaev 2017-11-08T11:31:31.000190Z

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

misha 2017-11-08T11:31:34.000252Z

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

igrishaev 2017-11-08T11:33:00.000221Z

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

igrishaev 2017-11-08T11:33:50.000006Z

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

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

misha 2017-11-08T11:34:00.000168Z

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

misha 2017-11-08T11:34:09.000325Z

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

igrishaev 2017-11-08T11:34:17.000360Z

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

misha 2017-11-08T11:34:39.000220Z

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

igrishaev 2017-11-08T11:35:06.000277Z

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

misha 2017-11-08T11:35:34.000404Z

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

igrishaev 2017-11-08T11:36:33.000242Z

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

misha 2017-11-08T11:37:04.000190Z

1сек

misha 2017-11-08T11:38:06.000206Z

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

igrishaev 2017-11-08T11:38:17.000039Z

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

misha 2017-11-08T11:38:30.000328Z

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

misha 2017-11-08T11:38:54.000318Z

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

igrishaev 2017-11-08T11:38:55.000014Z

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

misha 2017-11-08T11:39:30.000354Z

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

igrishaev 2017-11-08T11:39:46.000232Z

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

igrishaev 2017-11-08T11:40:46.000259Z

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

misha 2017-11-08T11:40:51.000133Z

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

igrishaev 2017-11-08T11:41:36.000306Z

ну вот смотри

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

misha 2017-11-08T11:42:02.000330Z

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

igrishaev 2017-11-08T11:42:22.000275Z

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

misha 2017-11-08T11:42:54.000234Z

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

igrishaev 2017-11-08T11:43:48.000216Z

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

misha 2017-11-08T11:44:43.000258Z

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