This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-05-01
Channels
- # admin-announcements (3)
- # arachne (6)
- # boot (17)
- # cider (51)
- # cljs-edn (19)
- # cljsjs (1)
- # clojure (22)
- # clojure-russia (154)
- # clojurebridge (5)
- # clojurescript (20)
- # cursive (1)
- # emacs (2)
- # ldnclj (1)
- # liberator (1)
- # mount (1)
- # om (44)
- # onyx (6)
- # ring-swagger (4)
- # rum (30)
- # slack-help (8)
- # untangled (40)
> Почему мапа пустая первые три вызова put-into-index
?? Почему на четвертом создается три мапы, а не апдейтится имеющаяся?
ленивость?
оо нас стало триста! (гусары молчать! 😄 )
Вот скажите, как это называется? Берёшь библиотеку и начинаешь фиксить и контрибутить. Берёшь тул, и начинаешь строчить багрепорты. "Not yet production-ready"?
@serioga: может быть и ленивость, но выглядит как магия. а то что в мапу не складывает?
Как мне кажется, номер сборки вне CI смысла не имеет (всё равно связывать между собой артефакты, логи, тесты etc).
clj-jgit.porcelain
: https://github.com/boot-clj/boot/blob/2816a053e04f41347382d10af3d9e5622b6f877b/boot/worker/src/boot/jgit.clj
да, про персистентность. в этом моем юзкейсе (чтение построково из файла, постройка индекса) есть вообще бенефит от персистентности? асинхронности вроде нет, io однопоточный и только у источника (вначале), потом линия вычислений. персистентные структуры они для других случаев? или кложа каким-то образом параллелит и этот простой юзкейс under the hood?
@bezrukov: а как можно модифицировать задачу, чтобы воспользоваться бенефитами персистентности? я пока даже использование индекса рассматриваю через "протаскивание" структуры данных через функции поиска, все в одну линию вроде...
@bezrukov: пытаюсь понять выгоды персистентной структуры данных на моем примере. недостатки уже прочувствовал.
@bezrukov: скорость ограничена io ясно дело, специальных мер по ускорению не предпринимал, но если структура персистентная, ээто как-то учитывается (оптимизируется) кложей?
читаем файл построчно, кладем в вектор строку и в мапу -- индекс каждого слова из строки с указанием на вектор (оригинальную строку). потом -- использовать
ну хорошо. а персистентная структура, которую я так бережно передаю из функции в функцию для чего тогда?
ну персистентная структура позволяет эффективно работать с иммутабельными данными, вот для этого..
если тебе иммутабельность не нужна - то лучше персистентные структуры не использовать.
что значит эффективно? вот тут я построил иммутабельную структуру. поиск по ней каким образом будет быстрее чем если бы она была мутабельной? в имплементации clojure???
хорошо. а как можно эту задачу модифицировать, чтобы иммутабельность пригодилась? со строками и индексом.
здесь надо запомнить, что вызов функции выдает результат в новом объекте на основе аргументов
@dottedmag: можешь привести пример на основе этого юзкейса? чтобы понять...
Скажем, в Haskell для таких алгоритмов используют часто монаду State
, чтобы инкапсулировать внутри функционального интерфейса мутабельную структуру.
@andmed: Вот у тебя есть функция, принимающая вектор и выплёвывающая map. Иммутабельность хороша тем, что 1) твой вектор, который ты туда засунул, функция тебе гарантированно не изменит; 2) мапой ты можешь распоряжаться как хочешь и пихать куда хочешь, она никогда внезапно под твоими ногами не изменится.
А внутри реализации алгоритма иммутабельность толком и не нужна, если он сам по себе именно цикл-распарсить-добавить
@andmed: вот тут Николай рассказывал про кложуру. В начале и про персистентные структуры есть. https://www.youtube.com/watch?v=6nA1OozPcbI
@dottedmag: ok но пока она не в атоме (а она здесь не в атоме) я ее и изменить никак не могу, кроме как напрямую в функции. что значит внезапно?
Где гарантии, что этот массив внезапно не станет короче или длиннее через 30 минут работы программы?
Потому что функция сохранила ссылку на него где-нибудь и другая часть программы вызвала на нём какой-нибудь метод.
Но это не значит, что всю обработку данных нужно делать на иммутабельных структурах. Иногда это полезно, иногда - вредно.
а. то есть энфорсится обработка переменной. а я уж думал кложа как-то треды запускает параллельно при обработке reduce или еще что... я про это..
Да, было бы интересно посчитать затраты на отладку мутабельных объектов в любой компании, которая использует node.
Поэтому я и написал "компании". Проблемы начинаются, когда суёшь объект в функцию, которая, судя по описанию читает твои аргументы, а потом день отлаживаешь, из-за того, что она где-то внутри что-то меняет.
И тогда начинаются заклинания типа "правила Дамблдора Деметера", которые тоже не помогают.
ага. просто я вот тут мучал...ся с передаче все "в линейку" и мысль сверлила: а для чего, собственно??
Из работающих вариантов решения есть подход Haskell "напишем всё в сигнатуре" и есть подход Clojure "по умолчанию всё иммутабельное, мутабельные штуки за углом, дятел просто не додумается".
> это на энтерпрайз заточенная фича прямо-таки ну вот написал ты свой мегаскриптик, обрабатывающий файл понравилось начал гонять его на больших файлах — долго пошёл втыкать многопоточность (хотя бы чтобы один поток читал данные из файла, другой заполнял индексы, а ещё ядра процессора хочется загрузить) — приехали, весь подход надо переделывать
@serioga: в случае с кложевским скриптом разве не переделывать? если условно запускать в два потока (второй с середины файла)
да, может оказаться вдруг, что иммутабельное решение имеет проблемы с происводительностью, но такие проблемы надо решать по мере возникновения
> в случае с кложевским скриптом разве не переделывать? если условно запускать в два потока (второй с середины файла) (edited) > и будет две иммутабельные структуры? не понял вопроса. я как раз рассказываю про проблемы решений, написанных с мутабельностью
https://github.com/steshaw/plt выглядит полезно, оставлю здесь
> если условно запускать в два потока (второй с середины файла) ну, это ты разделил чтение файла на независимые части допустим но пишешь-то ты в одно место?
ничего себе звёздочек
https://clojurians.slack.com/archives/clojure-russia/p1462116983001683
@serioga: как записывать в одну мутабельную структуру, представляю, как в иммутабельную -- пока не очень
точнее там прикол в том, что старая не забывается, а скорее всего новая структура это старая плюс какие-то изменения
> как записывать в одну мутабельную структуру тут больше вопрос, что у тебя за структура такая в примере индекса речь по сути идёт о базе данных
> точнее там прикол в том, что старая не забывается, а скорее всего новая структура это старая плюс какие-то изменения если там и есть такие оптимизации, то снаружи это не видно
ну да уж. юзкейс такой. вот я и пытался понять, как его можно трансформировать под "тру фп-вэй" пока что понял: иммутабельность удобна от "незапланированного" изменения данных. такая энтерпрайз фича. ну не знаю... плюс, эффективное хранение данных, это да
цепочка трансформации возможна и с мутабельной структурой. ленивость, стримы -- да, но это другое
> цепочка трансформации возможна и с мутабельной структурой.
если ты отправляешь мутабельную структуру в чужие функции, то цепочка трансформации становится непредсказуемой
> если ты отправляешь мутабельную структуру в чужие функции, то цепочка трансформации становится непредсказуемой особенно если эта структура — класс с методами и состоянием, когда вызов невинного метода может поменять состояние неожиданным образом
часто среди плюсов кложи подчеркивают первыми ее персистентные структуры. как практическая реализация это круто. но все равно есть понимание, что я чего-то не понимаю. буду думать(с)
там на самом деле, если хочется, то можно явно-мутабельные структуры сделать, через (atom ) например
к слову, в восьмой жаве есть .parallelStream()
вот там я понимаю почему переменная в стриме должна быть "effectively final" в кложе -- нет
@dottedmag: и скобочек пожалуйста!
они есть, просто опциональны <зануда-мод off>