Fork me on GitHub
#clojure-russia
<
2015-12-15
>
a.espolov00:12:32

@edvorg: Хочу сделать решение без js и didmount - почему именно так?

edvorg00:12:55

Просто пытаюсь сделать все это максимально средствами реагента (компоненты и атомы) и декларативно.

a.espolov00:12:15

да и где же заканчивается реагент по твоему?)

a.espolov00:12:29

без реакта апп бы не работал

edvorg00:12:36

Я думаю там где я начинаю вмешиваться в live cycle

a.espolov00:12:42

поэтому не вижу проблемы юзать методы компонентов реакта

a.espolov00:12:28

@edvorg: что за некоторые события?

a.espolov00:12:54

они знают о существовании кнопки?

edvorg00:12:40

Ну это в основном бизнес логика. Есть список, в него можно добавлять сложные элементы, нужно чтобы по завершению редактирования элемента (у него есть кнопка save) фокус переходил на кнопку add

edvorg00:12:02

Они не знают, но стейт фокуса кнопки то я им могу дать

a.espolov00:12:33

слушай походу тебе придется ждать помощи от другого)

a.espolov00:12:48

давай лучше к адептам om.next?)

a.espolov01:12:11

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

edvorg01:12:20

Не было времени поиграться с om.next, но он определенно в моем списке

a.espolov01:12:51

@edvorg: кложура для работы? или для себя?

edvorg01:12:44

Да вот фриланшу с недавнего времени фуллтайм, первый месяц к концу подходит.

a.espolov01:12:55

то есть c clojure не давно знаком?

edvorg01:12:33

Где то с год, но серьезно стал изучать с лета

a.espolov01:12:00

да так то с 2013 года знаком

artemyarulin08:12:00

увидел счас проект который уже clojure-1.8.0-RC3 использует. Кто пробовал? Есть там какие фишки интересные?

rm08:12:24

была какая-то функция, которая как map, только в коллекции каждый с каждым дает на вход

artemyarulin08:12:10

как то не впечатляет

rm08:12:39

блин, нет :)

rm08:12:40

прости

rm08:12:51

это я вопрос задаю, забыл название

artemyarulin08:12:26

ааа, лол simple_smile

ul08:12:22

@rm попробуй for

artemyarulin09:12:00

хм, может кто подскажет - я пишу кросс платформенный компонент для ом. Проблема заключается в том что у меня у компонента есть :require [om.dom :as dom] который внутри уже содержит require на реакт и тащит его, именно то что я хочу для браузера. Но когда я собираю под мобайл я не хочу тащить с собой 100кб реакта, я думал что запилю отдельный профайл для лейна по типу: [org.omcljs/om "1.0.0-alpha25" :exclusions [cljsjs/react cljsjs/react-dom]], но компиляция не проходит ибо om.dom все равно загружается и пытается подгрузить реакт которого нету Клоужра не умеет dynamic namespaces и я хз как это можно решить. Может кто сталкивался?

artemyarulin09:12:11

вопрос про require снимается - сделал exclusions и добавил пару пустых файлов с неймспейсами реакта чтоб компилятор не ругался

andfadeev09:12:24

всем привет, может кто подскажет куда копать, запилил я тут на работе небольшой прототипчик, для демонстрации коллегам (сервис который слушает сообщения из реббита, и потом в отдельных потоках обрабатывает их и шлет письма), юзаю несколько местных java библиотек, вцелом довольно много java interopa, отладил все в репле, все работает, решил попробовать собрать uberjar, а он зависает и все (не удалось дождаться успешной компиляции), если в том же проекте делаю другой неймспейс главным (считай пустой с одной фунцией -main), то все собирается норм

rm10:12:19

у меня вопрос

rm10:12:28

вот я запатчил некий пакет, сделал PR

rm10:12:49

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

ul10:12:13

lein install ?

rm10:12:36

а нет такого, чтобы я просто добавил пару файлов, сунул туда (ns a defn ...) и все стало хорошо?

rm10:12:57

в репле же я это могу делать

rm10:12:02

ну и из вима эвалить

turtle11:12:39

andfadeev: смотреть надо, просто так сложно сказать.

turtle11:12:34

rm: почему нет? Эвалишь в нужном неймспейсе и у тебя подменяется функция. Патчить, правда, атомарными объектами функциями.

prepor12:12:47

rm: lein checkouts

prepor12:12:13

симлинкаешь туда и все

artemyarulin12:12:11

@prepor: о, спасибо, не знал о такой штуке

rm14:12:35

спасибо

abtv16:12:33

@artemyarulin: ты вчера сказал, что в Ом Некст уже не так нужна core async . Я так понимаю, что единственное место, где она пригодится -это взаимодействие с native js, или есть ещё что-то?

Kira Sotnikov16:12:03

там когникаст с ноленом вышел

shinych18:12:39

а как элегантно сгруппировать например такой вот вектор [[:x1 :y1 :z1][:x1 :y2 :z2][:x2 :y3 :z3]], чтобы получилась мапа {:x1 {:y1 z1, y2 z2} :x2 {:y3 :z3}} ? есть что-нить готовое типа (group-by [first second] coll) ?

artemyarulin19:12:47

@abtv: Взаимодействие с нейтив все асинхронное, поэтому да - там core.async еще может пригодится

rm20:12:03

@shinych: я понаркоманил:

=> (reduce (fn [r, k] (let [f (first k)] (merge r {f (merge (f r) {(nth k 1) (nth k 2)})}))) {} x)
{:x1 {:y1 :z1, :y2 :z2}, :x2 {:y3 :z3}}

shinych20:12:06

@rm: ага, спс. подобное тоже нанаркоманилось simple_smile думал может чего стандартное есть. страшно подумать, во что это выродится, если вдруг приспичит на n уровней агрегировать simple_smile

rm20:12:52

да не особо выродится, просто recur где-нибудь добавится

larhat20:12:46

{(nth k 1) (nth k 2)} -> (apply hash-map (rest k)) ?

shinych20:12:13

@rm ну кстати да ) спасибо, вышло элегантнее, чем моя каракатица

rm20:12:13

на здоровье

niquola20:12:41

@shinych представь что есть функция put-in аля assoc-in только создающая ветку если её нет - тогда (reduce put-in {} your-coll)

asolovyov21:12:28

я не уверен, что тут кто-нибудь, кроме @dottedmag, помнит, чем меня раздражает re-frame и подобные: тем, что теряется минимальная типизация - неправильно указал кол-во аргументов в ивенте или его keyword неправильно написал? Узнаешь в продакшене %) Так вот чувак решил этот вопрос, не знаю, почему раньше в голову это никому не пришло, он тут все события отправляет рекордами: https://github.com/krisajenkins/petrol

niquola21:12:45

Хотя наврал, (reduce #(put-in %1 (butlast %2) (last %2)) {} coll)

asolovyov21:12:17

так assoc-in создаëт ветку, если еë нет

shinych21:12:54

ага, завтра осмыслю simple_smile уже мозг не того, завтра демку показывать, ещё не совсем готово, а моск уже закипает

shinych21:12:21

библиотечку для расзиповывания подскажет кто?

shinych21:12:38

их есть в гугле, но как-то глаза разбегаются

shinych21:12:15

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

prepor21:12:52

asolovyov: не понимать как рекорды добавляют "типизации". ну и кложа таки совсем не про это

larhat21:12:26

ну вот в питоне, когда надо было не наёбываться, вместо диктов с ключами я использовал класс с полями. любой линтер после этого ловил опечатки в "ключах". defrecord в кложе создаёт класс, как я понимаю, и статический анализ на жвм помощнее, но я хз, можно ли его применить к кложе?

prepor21:12:38

класс он то создаст, но внутри будет все та же мапина

prepor21:12:01

и создание класса через ту же мапину без всяких проверок

niquola21:12:02

Зачем вам события - можно экшн дергать?

niquola21:12:02

Не люблю pub/sub в ui

niquola21:12:00

профита нет, писанины много - лишь илюзия декауплинга simple_smile

asolovyov21:12:34

@prepor: да какая разница, что там внутри, проблема в том, что (send :soem-crap payload) норм скомпилится, а (send (->SoemCrap payload)) - нет, потому что ->SomeCrap надо писать.

asolovyov21:12:03

как показывает практика, это снижает количество головняка мне в разы, от того что кто-то херово где-то напечатал

asolovyov21:12:09

вот точно как @larhat говорит

asolovyov21:12:18

так сказать статическая типизация для бедных

prepor21:12:31

ну напиши (defn soem-crap [payload] {:soem-crap payload}) если очень хочется, рекорды то тут при чем

asolovyov21:12:35

@nicola: ну вот у меня сейчас и нет пабсаба, но я хочу, чтоб хранить историю происходящего

prepor21:12:48

но таким образом типизацию обеспечивать — это бред какой-то

prepor21:12:52

кложка не про это

asolovyov21:12:02

@prepor: я могу, но тогда из-за простоты люди начинают писать это руками и всë вырождается в то же самое

asolovyov21:12:24

у тебя походу на проекте 2 человека сейчас?

prepor21:12:35

ну это типа кложка. тут "из-за простоты" можно писать мало кода и больше смысла

asolovyov21:12:36

у меня потому что 6 и это заметная трабла даже на пайтоне

prepor21:12:43

но без всякой типизации

asolovyov21:12:58

авжеж, но только уровень людей влияет энивей

asolovyov21:12:06

а ты не можешь взять и сразу сделать всех шарящими

asolovyov21:12:24

поэтому есть какие-то места, где мне нужны уступки и какие-то минимальные гарантии

prepor21:12:34

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

asolovyov21:12:34

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

asolovyov21:12:58

в общем ладно, я твоих возражений пока что так и не понял

asolovyov21:12:13

если не хочешь пабсаб - есть функции, если хочешь - то вот чувак неплохо придумал

asolovyov21:12:32

what's the objection? слать киворды? stringly-typed messaging?

prepor21:12:49

я про паб саб ничего и не говорю. я про твои попытки сделать из кложи яву )

asolovyov21:12:11

да если б у меня было времени и воли, я б core.typed тока так впилил :-))

larhat21:12:15

так оно ж локально? если тебя минимальное локальное усилие спасает от опечаток — по-моему охуенная цена

prepor21:12:54

ну и пиши на яве

niquola21:12:57

@asolovyov а зачем тебе история, интересно ;)

prepor21:12:07

"минимальные усилия" повсюду понемножку

asolovyov21:12:24

@nicola: чтоб когда что-то подыхает, я эту историю зашлю на сервак и смогу потом подебажить

prepor21:12:27

и не надо ничего придумывтаь

larhat21:12:39

@prepor ну ты ща в идеологию какую-то ушёл и крайности

asolovyov21:12:44

@prepor: если доводить до крайности, то можно разную хрень выдумать )

artemyarulin21:12:51

весело тут у вас

larhat21:12:00

типа, засорили мою КонцептуальнуюПростотуКложи своим kingdom of nouns явовым

asolovyov21:12:29

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

prepor21:12:35

от опечаток в кложе тебя должны спасать тесты. все.

asolovyov21:12:44

та ну нахуй

larhat21:12:48

у тебя 100% ковераж? :)

asolovyov21:12:52

мне тут листочкин недавно такую же чушь парил

prepor21:12:53

> так нехер было рекорды создавать тогда, все вопросы к ричу 😃 он рекорды не для этого совсем впилил

asolovyov21:12:08

каже live reload не нужен, потому что всë покрыто тестами

prepor21:12:10

"чушь", конечно

prepor21:12:18

ваще не связанные вещи

artemyarulin21:12:35

мне казалось репл как раз спасает от опечаток. 100% тест коверейдж - утопия

asolovyov21:12:09

live reload полезен, минимальная проверка на компиляции полезна, если думать только об идеологии, то можно долго заниматься ментальным дрочерством вместо решения задач.

prepor21:12:28

нет никакой утопии, это простая механическая работа, пройти просто по пути кода, проверяя таким образом опечатки и типы

asolovyov21:12:29

хики впилил рекорды потому что мультиметоды тормозят, да

prepor21:12:46

для этого есть reify

asolovyov21:12:48

ну как нет если да?

asolovyov21:12:07

reify это интеграция с джавой

asolovyov21:12:20

а рекорды это способ динамического диспатча на кложуре

asolovyov21:12:51

я пару месяцев назад их дискуссию по поводу создавать/не создавать рекорды читал, из ирки где-то

prepor21:12:53

"минимальная" проверка при компиляции она такая, какая есть в кложе. т.е. та, что не портит язык и которую можно при этом легко релизовать. типа функиця объявлена, переменная в скоупе существует. а не выдумывания конструкторов мап и филдов, что б с количеством аргументов не ошибиться

artemyarulin21:12:00

зафега вам вообще этот live reload, он жеш убог? Это все от фигвила началось что народ счас репл не включает и тока по лайв релоад все смотрит? Реально не понимаю, прояснит может кто, ведь репл...

asolovyov21:12:25

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

prepor21:12:25

> reify это интеграция с джавой ​> а рекорды это способ динамического диспатча на кложуре ты все перепутал

prepor21:12:28

как раз наоборот

rm21:12:20

asolovyov: конечно в репле, ведь твоя кнопка -- всего лишь отображение стейта

asolovyov21:12:20

@prepor: твоë предложение с (defn soem-crap [payload] {:soem-crap payload}) это ровно тот же конструктор мапы

prepor21:12:30

я и говорю — говно

larhat21:12:36

@prepor: http://clojure.org/datatypes вот тут согласны с пираньей

prepor21:12:38

но для этого говна рекорды не нужны

larhat21:12:40

а не с тобой

larhat21:12:46

про назначение defrecord и reify

artemyarulin21:12:30

ну я заэвалю рендер кнопки если надо. Но просто при наличии репла опечаток не должно ж быть вообще - заэвалил, проверил. Всяко лучше чем тест на любой чих писать который может и до прода не дойдет

asolovyov21:12:41

ну при чëм тут опечатки?

prepor21:12:47

> вот тут согласны с пираньей давай процитируй что ли )

asolovyov21:12:50

смотришь тупо глазами - так нарисовал или не так?

asolovyov21:12:58

я еще тесты на внешний вид не писал

larhat21:12:06

reify: Invocation of methods on the instance is direct, not using map lookup.

artemyarulin21:12:09

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

prepor21:12:10

> In this respect it is use case similar to proxy, or anonymous inner classes in Java. ты вот это прочитал как "интеграция с джавой"? )

larhat21:12:13

сразу лейтбиндинг нафиг

larhat21:12:27

и динамик диспатч

asolovyov21:12:36

@artemyarulin: это абсолютно ортогональные вещи

asolovyov21:12:50

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

artemyarulin21:12:55

аааааааа

asolovyov21:12:56

и нет дополнения кивордов

artemyarulin21:12:18

не согласен что оно нужно - но усек причины

asolovyov21:12:21

плюс в репле полотно хиккаповское писать нет никакого желания

asolovyov21:12:42

поэтому в репле я только терзаю функции, которые проверяют работу

niquola21:12:09

так в чем польза от recordов?

artemyarulin21:12:23

>в репле у меня есть дополнение рекордов по табу

prepor21:12:23

в том что named class есть

prepor21:12:29

можно из явы юзать

asolovyov21:12:47

java, not named, no base class -> reify

asolovyov21:12:50

только в этом случае

niquola21:12:51

you need to define type?

asolovyov21:12:06

если кложура, named -> defrecord/deftype

asolovyov21:12:47

@nicola: я этот флоучарт привел не в подтверждение своей мысли про petrol, а в подтверждение слов про то, что рейфай - это для интеграции с джавой

asolovyov21:12:56

это опять же ортогональная проблема :-))

asolovyov21:12:21

do I need a type? I wouldn't mind, как-то так

asolovyov21:12:53

dnolen, известный относительно перец, вроде, протоколы и рекорды любит нежной любовью, и хики на него не матерится

niquola21:12:02

там reify вроде один хоп не дотянул simple_smile

asolovyov21:12:07

я сделаю вид, что я могу себе позволить то же самое

asolovyov21:12:16

@nicola: до чего?

niquola21:12:22

до интеграции

prepor21:12:43

asolovyov: очень хреновое подтверждение )

asolovyov21:12:33

@prepor: короче, блин, я читал их чат, где обсуждали, что мультиметоды тормозят и нужно просто поверх джавного диспатчера сделать что-то быстрое для кложуры. Если быстрое, то это только диспатч по типу первого аргумента. Вот и сделали рекорды.

prepor21:12:33

dnolen: и что случилось с последним детищем этого перца? ) а сколько обвязок пришлось написать вокруг его интерфейсов на рекордах и протоколах? )

prepor21:12:44

мультиметоды тормозят, кто ж спорит

niquola21:12:45

это уже ближе simple_smile

asolovyov21:12:57

ну так какого хера я перепутал? )

asolovyov21:12:02

reify это для интеропа с джавой

asolovyov21:12:06

в основном

niquola21:12:07

да ладно, он тролит

prepor21:12:19

asolovyov: как скоростные характеристики reify в релизации протоколов отличаются от defrecord?

asolovyov21:12:39

результат идентичен же

asolovyov21:12:52

я сча только о причинах их создания

prepor21:12:53

НЕТ это более функциональный способ реализовывать protocol-based полиморфизм

niquola21:12:56

reify позволяет отнаследоваться только

niquola21:12:04

в этом и различие

prepor21:12:20

reify вообще не про "отнаследоваться"

niquola21:12:30

поясняй - нехер он тогда нужен

asolovyov21:12:30

да, рейфай не позволяет наследоваться 😃

asolovyov21:12:40

он только интерфейс позволяет заимплементить

prepor21:12:48

> НЕТ это более функциональный способ реализовывать protocol-based полиморфизм с замыканиями и всем таким

niquola21:12:51

ну как на схемке видо

asolovyov21:12:05

@nicola: do you need to extend base class? no = reify

niquola21:12:42

вижу yes simple_smile может не ту картинку смотрю

larhat21:12:00

> НЕТ это более функциональный способ реализовывать protocol-based полиморфизм ты тут "функциональный" используешь как "мне больше нравится"/"пиздатый"?

prepor21:12:01

(defn Foo [m] (reify Protocol (bar [] :zoo)) значительно гибче, чем (defrecord Foo [m] (reify Protocol (bar [] :zoo))

prepor21:12:29

> ты тут "функциональный" используешь как "мне больше нравится"/"пиздатый"? нет, как нечто что любит оперировать firstclass сущностями

prepor21:12:34

такими как функциями

prepor21:12:45

а в данном случае "пакетом функций"

asolovyov21:12:47

(defrecord Foo [m] Protocol (bar [] :zoo)) только, но ок

niquola21:12:52

имплементация интерфейса - это наследование - нет?

asolovyov21:12:05

@nicola: но есть нюанс! 😃

larhat21:12:07

так reify и функции ортогональны

asolovyov21:12:08

не наследование, в общем

prepor21:12:09

> (defrecord Foo [m] Protocol (bar [] :zoo))` только, но ок ну скопипастил быстро слишком, да )

larhat21:12:32

@prepor: тебя ж вроде никто не заставляет с reify пользоваться функциями и наоборот?

prepor21:12:40

> так reify и функции ортогональны с чего вдруг? функция это просто reify реализующая только один протокол Invoke

asolovyov21:12:43

@prepor: ты затянул меня в ментальное дрочерство, и я не могу вырваться!

asolovyov21:12:58

давно не попадал в такие ловушки

prepor21:12:02

а так фундаментальные свойства все те же

prepor21:12:09

first class и замыкания

asolovyov21:12:14

больше тебе ничего не расскажу

niquola21:12:18

ну надо прийти к консуенсусу

niquola21:12:23

так не годиться

asolovyov21:12:28

так какой консенсус?

artemyarulin21:12:32

дада - закончите, все ждут вывода!)

niquola21:12:34

давайте ктонить подитожит

asolovyov21:12:40

я щас себе херану пабсаб на рекордах

larhat21:12:42

нужно переписать всё на с

prepor21:12:51

мой поинт про то что функиця это частный случай reify должен был всех победить, имха

asolovyov21:12:58

и когда у меня возникнут траблы - я приду и скажу "ну бля @prepor был прав, пипец мне теперь"

larhat21:12:21

> мой поинт про то что функиця это частный случай reify должен был всех победить, имха ну этот пойнт ни о чём, хотя и правильный :)

asolovyov21:12:29

но так как вместо "когда" надо использовать "если", и скорей всего всë будет ок, и я достигну, чего хочу, то я просто буду себе молчать и быть довольным )

larhat21:12:33

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

larhat21:12:50

и к "defrecord или reify вместо мапов" тоже :)

prepor21:12:07

добавляет йопт

asolovyov21:12:08

ну вместо мапов дефрекорд, канеш

asolovyov21:12:28

раз уж язык даëт какую-то хрень прямо в языке, то я еë собираюсь заюзать!

asolovyov21:12:33

это ж не джаваскрипт

asolovyov21:12:42

у нас пока что всë - good parts =))

niquola21:12:46

Чем различаются reify и defrecord?

asolovyov21:12:56

defrecord тебе определяет рекорд

niquola21:12:00

голосуем за ответы

asolovyov21:12:03

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

asolovyov21:12:10

reify тебе напрямик сразу объект даëт

asolovyov21:12:16

без промежуточного типа

asolovyov21:12:26

reify на русский переводится как "материализовать"

niquola21:12:30

можно ли наследовать интерфейс через defrecord?

asolovyov21:12:47

он материализует протокол или интерфейс прямо на месте

asolovyov21:12:52

имплементировать? можно

asolovyov21:12:20

наследовать интерфейс == создать интерфейс-наследник, нас это в теории не интересует

asolovyov21:12:28

в кложуре ж нельзя наследовать протоколы

niquola21:12:38

ок имплементировать

asolovyov21:12:38

а в джаве можно интерфейсы наследовать, бтв? я как-то хз

niquola21:12:23

расширяем тогда simple_smile

larhat21:12:25

^^^ в смысле, оно расширять позволяет интерфейсы

larhat21:12:41

"дополнять"

larhat21:12:42

скорее

asolovyov22:12:05

так это не про то походу

niquola22:12:31

вот теперь поняли - что разницы между ними как между анонимным классом и классом почти нет

larhat22:12:40

ну interface A extends B — значит чувак, который реализует A должен и B тоже

asolovyov22:12:51

а, в джаве

niquola22:12:29

A is B некоторые считают наследованием

niquola22:12:38

но интерфейсов

niquola22:12:23

зачем может понадобиться заменить map на record?

asolovyov22:12:46

для расширяемости?

asolovyov22:12:02

если б в honeysql везде мапы внутри были, все бы слали туда тыщи PR

asolovyov22:12:23

(defmethod honeyfmt/fn-handler "contains" [_ left right]
  (str (honeyfmt/to-sql left) " @> " (honeyfmt/to-sql right)))

(defmethod honeyfmt/fn-handler "overlaps" [_ left right]
  (str (honeyfmt/to-sql left) " && " (honeyfmt/to-sql right)))

(defmethod honeyhelpers/build-clause :returning [ _ m cols]
  (assoc m :returning (honeyhelpers/collify cols)))

(defmethod honeyfmt/format-clause :returning [[_ cols] _]
  (str "RETURNING " (honeyfmt/comma-join (map honeyfmt/to-sql cols))))

asolovyov22:12:42

а, у них там методы, гагага

niquola22:12:44

ну это мультимедод - причем он здесь?

asolovyov22:12:48

ну ок, вот так:

asolovyov22:12:53

(extend-protocol jdbc/ISQLValue
  org.joda.time.DateTime
  (sql-value [v]
    (timec/to-sql-time v)))

niquola22:12:04

ага но это interop

niquola22:12:12

мы пока в clojure

asolovyov22:12:21

ISQLValue это кложурный протокол

asolovyov22:12:29

по крайней мере это clojure.java.jdbc

asolovyov22:12:41

там часть кложурных протоколов, часть - джавных интерфейсов )

niquola22:12:42

сча глянем

asolovyov22:12:21

ладно, мне завтра рано вставать, я ушëл спать )

niquola22:12:45

подожди немного

niquola22:12:03

но это протокол, а не record