Home
Objective Caml
ocaml@conference.jabber.ru
Суббота, 25 июня 2011< ^ >
gds установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Светлое будущее -- http://camlunity.ru/ | Нефильтрованное настоящее -- https://github.com/camlunity/kamlo_wiki | Портер прошлое -- http://gdsfh.dyndns.org/kamlo/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+4
[00:01:01] <ermine> gds: а есть уже другие стабильные юзеры ocaml-iteratees?
[00:01:17] <bobry> а где оно лежит? на битбакете?
[00:01:18] <ermine> с устойчивой психикой
[00:01:34] <ermine> на форге
[00:01:39] <gds> ermine: пара серверов юзает, разве что.  живых --  ет.
[00:02:06] <ermine> gds: о, чур, я первая!
[00:03:03] <gds> bobry: hgweb отвалился там, есть разве что
hg http: http://hg.ocamlcore.org/cgi-bin/hgwebdir.cgi/ocaml-iteratees/ocaml-iteratees/
hg ssh: ssh://ssh.ocamlcore.org//hgroot/ocaml-iteratees/ocaml-iteratees
срань, конечно, но сильван обещал починить.
[00:04:13] <gds> ermine: ага!  Однако вроде Typhon и komar смотрели, может кто-нибудь из них уже что-то успел, хехе.
[00:04:58] <bobry> что то совсем тут все плохо с hg http://hg.ocamlcore.org/cgi-bin/hgwebdir.cgi/ocaml-iteratees/file/000000000000/?style=ocaml
[00:05:02] <ermine> komar: ты уже сочинил первый итерат?
[00:05:46] <gds> bobry: там бида, факт.  Ждём исправлений.  Сам лично петонизировать не хочу.
[00:06:14] <bobry> странно что на окамле никто не написал dvcs кстати
[00:06:24] <ermine> модная штучка в камлунити
[00:07:13] <gds> а если запилить клон итератов на битбакете, то буду забывать обновлять обе репки, ибо у меня в мозгу откуда-то взялась директива "если в публичный доступ выложил -- публика свободна", и во второй публичный доступ не выкладываю.
[00:08:22] <ermine> пора уже любить гит
[00:08:28] <ermine> и гитхуб
[00:08:29] <gds> dvcs на окамле напишут, только сначала "on-disk datastructures" надо запилить, из https://github.com/camlunity/kamlo_wiki/blob/master/CrazyIdeas.md которые, и можно лепить.
[00:09:07] <bobry> functional revlog :D
[00:09:29] <bobry> ermine: как же можно гит любить --to --many --flags-to-remember
[00:09:50] <gds> про revlog вот кстати подумал буквально когда отправлял сообщение.  Там кизячок, меркуриаловские дописываемые файлы больше гарантий дают.
[00:09:51] <bobry> а маны гита отпугнут даже бывалого гика ...
[00:09:52] <gds> ну за что же гит любить, емое...  за github, разве что.
[00:10:00] <bobry> да-да
[00:10:25] <ermine> развели VCS, теперь одни проблемы кругом
[00:10:51] <bobry> :)
[00:10:58] <bobry> каждому языку по vcs
[00:10:59] <gds> bobry: бывалых гиков маны не вставляют, они читают http://los-t.livejournal.com/tag/git%20guts
[00:11:17] <bobry> аватар намекает :)
[00:11:33] <bobry> на gh по моему тоже был цикл статей про git internals
[00:12:01] <gds> а красноглазные котоосьминоги на гитхабе не намекают?..
[00:12:23] <bobry> лол
[00:22:38] <ermine> хм
[00:24:44] <ermine> gds: есть такое впечатление, что >> не игнорирует результат выполнения первого итерата
[00:25:25] <gds> учитывая энергичность окамла, я бы вообще не рекомендовал >>, если честно.
[00:25:38] <gds> и как определён >> ?
[00:26:36] <gds> для сверки -- видимо, должно быть
value ( >> ) m f = m >>= fun () -> f;
[00:26:39] <ermine> у тебя?
[00:26:48] <gds> вообще, понятно, почему ">>" крив?
[00:26:58] <gds> в окамле, а не у меня.
[00:28:56] <ermine> не поняла чота, где тут подвох
[00:30:31] <ermine> f в том выражении тоже хочет аргумент, так что не выполнится же?
[00:30:37] <gds> второй аргумент в >>= имеет тип "лямбда от результата первого аргумента к итерату".  в >> -- тип "итерат".  Если при создании итерата выполняются сайд-эффекты либо оно вообще не нужно (например, если первый всегда выходит с ошибкой), то разница есть.
[00:32:13] ermine опять не поняла
[00:32:29] <ermine> у тебя видимо f - не итерат, и поэтому чанк ему не скормить
[00:32:48] abiogenesis вошёл(а) в комнату
[00:37:46] <gds> ermine: а, не, если "игнорировать", а не "удостовериться, что unit", то
value ( >> ) m f  =  m >>= fun _ -> f;
ну вот тут -- итерат, так как >>= вторым аргументом кушает, условно,
'a -> iteratee 'el 'b
, и вот этот 'a попадает в fun _
Всё чотко.\
[00:39:32] <ermine> gds: ну, а что с >> тогда?
[00:40:26] <ermine> и при чом тут энергичность бедного камла :)
[00:40:43] <ermine> видимо пора спать
[00:41:30] <abiogenesis> а расскажите мне сказку на ночь, как вы зарабатываете с помощью окамля
[00:47:16] <abiogenesis> зайки не молчите, я же не засну
[01:07:46] <ermine> gds: еще и жуткая обертка результатов в виде `Ok, `Error
[01:08:11] <ermine> в общем разобралась как запускать, теперь точно можно спать
[01:08:50] <abiogenesis> а как же я?
[01:09:10] ermine вышел(а) из комнаты
[01:09:19] <abiogenesis> ;[
[01:34:59] bobry вышел(а) из комнаты
[01:35:22] bobry вошёл(а) в комнату
[01:45:48] abiogenesis вышел(а) из комнаты
[01:59:07] <gds> abiogenesis: лично я сейчас -- около вебни, около баз данных, около системщины что-то леплю, программки всякие, веб-службы, где-то dsl'ы и около них.  вон, делаю свой новый dbi, с итератами и аппликативными функторами, и тоже оплачивается.  или, вон, упрощённые в сотню раз ocsigen+eliom состряпал, но на правильных концепциях и под конкретные задачи, -- и тоже ок.
[02:06:59] gds вышел(а) из комнаты
[02:55:37] zinid вошёл(а) в комнату
[02:55:47] zinid вышел(а) из комнаты
[02:56:01] zinid вошёл(а) в комнату
[02:56:55] bobry вышел(а) из комнаты
[02:57:23] bobry вошёл(а) в комнату
[03:52:27] abiogenesis вошёл(а) в комнату
[04:53:33] abiogenesis вышел(а) из комнаты
[07:46:36] ftrvxmtrx вышел(а) из комнаты
[07:46:43] ftrvxmtrx вошёл(а) в комнату
[10:09:32] <komar> gds, ermine, шо, куда? Мне итераты некогда, мне работать надо.
[11:27:25] ermine вошёл(а) в комнату
[12:05:53] gds вошёл(а) в комнату
[12:08:42] Digimmortal вошёл(а) в комнату
[13:01:05] arhibot вошёл(а) в комнату
[13:05:50] arhibot вышел(а) из комнаты: Replaced by new connection
[13:05:51] arhibot вошёл(а) в комнату
[13:12:56] arhibot вышел(а) из комнаты
[14:06:58] <ermine> gds: ты так и оставишь >> хотящим () от первого аргумента?
[14:07:51] <gds> ( >> ) a b  ==  ( >>= ) a (fun _ -> b)
тут консенсус?
[14:08:07] <ermine> там все проще
[14:08:17] <ermine> let (>>) x f = fx
[14:13:02] <gds> в итератах это не так, так как для итератов (>>) : iteratee 'el 'a -> iteratee 'el 'b -> iteratee 'el 'b , ну классическое монадное.
[14:14:13] <gds> если про семантику, то "выполнить первое, проигнорировать значение, выполнить второе".
[14:15:13] <ermine> да я еще обнаружила, что есть >>=, >>> и еще что-то :)
[14:15:23] <ermine> как всё это запоминать-то
[14:17:44] <gds> не запоминай.  I.Ops есть, в котором всё инфиксное, нужное для итератов, описано.
[14:18:09] <ermine> в опсах как раз f x
[14:18:15] <gds> I.Ops???
[14:18:21] <gds> я про Iteratees.Ops
[14:18:27] <ermine> в It_Ops
[14:18:28] <gds> Iteratees.Make(IO).Ops
[14:18:38] <gds> а, ну так то другое.
[14:18:56] <gds> просто одинаковые обозначения для разных вещей.
[14:25:22] rren вышел(а) из комнаты
[15:21:59] Digimmortal вышел(а) из комнаты
[16:20:51] ermine пытается воткнуть в енумерации
[16:42:59] komar вышел(а) из комнаты: Replaced by new connection
[16:42:59] komar вошёл(а) в комнату
[16:54:09] <gds> отрефакторил две мега-штуки из dumbstreaming, присунул в ocaml-iteratees: 1. ту самую first result or last error, 2. чтение целых чисел (опционально знаковых, опционально с запретом ведущих нулей (для безопасности иногда важно)) со строгими проверками на переполнение -- функции с именами read_[u]int{,32,64}[_nz].
Ещё вон на днях с ermine покумекаем про бектрекинг, накодим, и можно будет 0.4 выпускать.
[17:00:33] <gds> а, собственно, занафига я это всё делал -- чтобы впихнутая читалка Num.num смотрелась гламурненько, ибо она тоже будет на итератах внутри, хоть и иметь тип string -> Num.num.  Да, и "чистую манатку" (ака "Identity") надо бы выродить, где type m +'a = 'a, и всякие операции ввода-вывода кидают исключения в рантайме.
[17:07:31] <ermine> итератомания
[17:08:04] <ermine> gds: уже пора пуллить итераты?
[17:08:19] <gds> ща присуну Pure_IO для чистых штуки -- и да.
[17:08:23] <gds> сообщу в чятик
[17:08:30] <gds> ибо уже почти сделал, и полезно кое-где.
[17:10:57] <ermine> gds: ну в общем, я бы уже теперь пуллила каждый раз, как ты запушишь, чтобы было up to time
[17:11:14] <gds> а тебе от меркуриала не противно?
[17:11:18] <ermine> пока что щас у меня енумерация "не компилится"
[17:11:53] <ermine> gds: ну hg pull - больше никаких команд я там не знаю
[17:12:24] <gds> понял.  В общем, сообщу, как присуну.
И вообще, надо бы потренироваться hg<->git, ибо по работе будет надо, видимо.
[17:13:31] <ermine> гы
[17:41:12] <gds> ermine: пушнул Pure_IO
[18:10:27] <ermine> gds: это строки?
[18:11:02] <ermine> gds: кстати, а как заполнить Subarray юникодными интами без помощи списка?
[18:11:31] <ermine> надо что-то типа Array.make
[18:11:34] <gds> Pure_IO -- это `Ok|`Error, не требующее ни окамловского стандартного ввода-вывода, ни lwt.
[18:11:42] <gds> ermine: юникодные инты откуда берёшь?
[18:12:11] <ermine> gds: из текста с неизвестной кодировкой
[18:12:32] <ermine> ну, заранее неизвестно
[18:12:43] <gds> а как они становятся известны для S.t -- ты их передаёшь в массиве или как?
[18:12:46] <ermine> это случай xml
[18:13:33] <gds> S.of_array_sub : array 'a -> int -> int -> S.t 'a  --  из подмассива
[18:13:44] <gds> самое дешёвое создание, если чо.
[18:14:15] <ermine> gds: ну щупаем первые четыре байта текста, угадываем как там латиница представлена, парсим <?version=1.0 encoding=smth ?> и щупаем smth и дальше можно заполнить subarray чем надо
[18:15:56] <ermine> gds: ну пока что это текст, никакого array нет, а два раза перегонять - это нонсенс
[18:17:11] <gds> хреново дело, ибо если правильно делать, то надо покодить маленько, что-то типа npeek родить.
А дальше, когда асилили encoding и поняли, как с ним жить, следующий итерат, по идее, должен кушать array uchar, где uchar -- это тип, наиболее общий для всех кодировок, так?
[18:17:46] zinid вышел(а) из комнаты
[18:17:46] <ermine> другой вариант - использовать те же енумерации, как завещал Киселев
[18:18:02] <ermine> но там тоже создавать чанк надо для вложенного итерата
[18:18:38] <gds> так вот, я к тому и подвожу: брать итерат, парсящий внутреннее, и давать ему в одном случае либо перекодированное (видела у меня utf8, думаю), либо давать напрямую, без копирований.
[18:20:08] <ermine> не видела, не обратила внимания
[18:21:28] <ermine> в общем, это хорошо, что ты не испугался, значит можно пробовать уже парсить зумль :)
[18:22:44] <ermine> запуллила итераты - не найдено изменений
[18:23:33] <gds> в общем, контролируемый бектрекинг нужен, как я уже понял.  Он крив, к нему я забабахаю жырное предупреждение "если процессор и память дороги вам, держитесь подальше от бектрекинга".  Им же можно будет реализовать парсинг первых 4 байтов, далее вернуться и продолжить с правильной латиницей через енумераты, и, асилив encoding=smthng, дальше (горизонтально соединив итераты) парсить, учитывая и латиницу, и реальную кодировку.  Как-то так, или концептуально прогнал где-то?  Тебе тут сильно виднее.
[18:24:49] <ermine> а вроде мы договорились, что бэктрекинг не нужен, что будем всё откусывать сразу
[18:25:06] <gds> ermine: если "hg ident ssh://gds@oldub/dev/ocaml-iteratees" выдаёт не "9ad16ee357ef", то сообщи.
[18:25:13] <ermine> а для перекодировки буду юзать ocaml-text
[18:25:30] <gds> тьфуты, точнее, если у тебя в репке hg ident выдаёт не 9ad1...
[18:26:07] <gds> ermine: а какие варианты без бектрекинга -- что может быть в первых 4 байтах?  utf16 всякие?
[18:26:52] <ermine> d4127df43a44 tip
[18:27:30] <gds> hg pull -u надо, либо hg up сейчас.  т.е. изменения подтащила, а рабочая копия стара.
[18:28:46] <ermine> 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
[18:29:30] <gds> я скоро иду погулять, однако, если хочешь поработать так, чтобы можно было использовать результат по-любому, советую писать итерат, работающий уже с S.t uchar, а как конкретно его получить -- уже потом решим.  В итератах это поставлено слегка с ног и немножко на голову: сначала думаем про логику, про внутренние потоки, а потом сопрягаем их с внешними реалиями.
[18:30:07] <ermine> да иди погулять, это важнее :) а моя потерпит
[18:30:09] <gds> тьфуты, я вообще запарился, внутренний урл тебе дал.  В общем, у тебя так?
$ hg ident ssh://ssh.ocamlcore.org//hgroot/ocaml-iteratees/ocaml-iteratees
9ad16ee357ef
[18:31:49] <ermine> pulling from http://hg.ocamlcore.org/cgi-bin/hgwebdir.cgi/ocaml-iteratees/ocaml-iteratees/
[18:31:57] <ermine> вот этот урл
[18:32:27] <ermine> ладно, надо куда-нить переметнуться еще
[18:36:13] <gds> если не вносила изменений в итераты, то советую склонировать заново:
$ hg clone ssh://ssh.ocamlcore.org//hgroot/ocaml-iteratees/ocaml-iteratees
[18:36:42] <gds> либо в .hg/hgrc исправь урл на нужный и сделай hg pull -u
[18:37:23] <ermine> а доступ по ssh у меня есть?
[18:39:27] <gds> срань господня.  Сейчас отпишу.  форж затрахал.
[18:40:10] <ermine> да иди погуляй уже
[18:40:24] <ermine> это ж не так горит, сначала логика, потом IO
[18:41:54] <gds> IO у тебя ровно в одном месте будет -- в енумераторе, который будет кормить итераты.
[18:42:49] <ermine> ага
[18:43:06] <ermine> ну пока что-то типа enum_pure_1chunk пашыт и ладно
[18:43:55] <gds> $ hg clone https://bitbucket.org/gds/ocaml-iteratees
[18:44:25] <gds> пока ещё минут 5 дома, поэтому прошу, отпиши, что получилось.
[18:45:06] <gds> после клонирования в репке выполни
$ hg ident
и должно быть
9ad16ee357ef tip
Если так, что всё обновилось.
[18:45:19] <gds> лучше в свежей-чистой дире это делать.
[18:45:28] <ermine> скачала
[18:46:19] ermine смотрит в пюре_ио
[18:46:49] <ermine> ну теперь можно выкинуть директ_ио
[18:48:05] <ermine> смешной файлик
[18:53:39] <gds> мне он помогал.
[18:58:45] <ermine> не, я про свой код
[19:00:51] <ermine> перекомпилила и переинсталлила
[19:01:06] ermine пошла жарить чье-нить мясо
[19:45:31] abiogenesis вошёл(а) в комнату
[20:18:19] abiogenesis вышел(а) из комнаты
[22:24:17] ermine ползает на руках между трёмя соснами итератов
[22:24:38] <ermine> ужасно блуждать между IO.m и без него
[22:25:58] <gds> факт, ужасно.  Однако это даёт свои вкусняшки -- например, ё-монада может быть совершенно разной, и эти сирани итераты будут работать одинаково.
[22:28:02] <ermine> пока не заценила вкусности, пока одни неурядицы компиляции при замыканиях внутри енумераций
[22:28:27] <gds> "енумерации" -- это что?  давай конкретику.
[22:28:44] <ermine> enumeratee
[22:28:55] <ermine> итерат, который трахает другой итерат
[22:29:39] <ermine> надо еще попробовать сделать итерат, делающий регэкспшный +
[22:29:54] <ermine> или аналог хаскильного many
[22:41:45] <gds> есть I.sequence -- он берёт на вход итерат, которому дают покушать входной поток енумерата, и который возвращает результаты, которые даются вложенному итерату (собственно, клиенту enumeratee).
я знаю, что майндфак, сам вникал долго.
проще представить enumeratee как себя, имеющего внутри какую-то штуку, и тебе решать, что и как той штуке дать, но тебе дают то, что ты попросил.  Однако, если та штука хочет юникод, а ты занимаешься тем, что кушаешь чанки байтов и даёшь юникод, то вот надо кушать, преобразовывать, давать, кормить.
[22:46:08] <ermine> ну я enumeratee понимаю как вон тот take
[22:47:50] ermine воспользовалась heads как дешевым способом выяснить, не заголовок ли абзац, и какого уровня
[22:49:19] <ermine> gds: а каким итератом дешевлее скипать пробелы (' '+)?
[22:55:04] <ermine> нету
[22:55:47] <ermine> придется потренироваться на еще одном ужасном итерате
[22:56:07] <gds> ermine: дешевле -- тем, который чанк осматривает лично.  А так -- I.drop_while is_whitespace, наверное.
[23:03:14] <ermine> оптимизировать будем чуток попозже
[23:03:27] <ermine> я тебя еще запилю, если оно будет тормозить :)
[23:04:57] <ermine> блин, в таких итератах как break и drop_while читы используются
[23:05:51] <ermine> и при этом свой чит не добавишь, не залезев в чужие исходники
[23:06:12] <ermine> gds: вот это первый фичареквест, чтобы можно было добавлять свои читы
[23:31:48] <gds> ermine: да какие читы?  тебе дают чанк -- его и этосамое!  Как хочешь!  Как в хвост, так и в гриву!
[23:42:44] <ermine> gds: а зачем существуют S.drop_while и тому подобное?
[23:46:21] <gds> ermine: ты хочешь, чтобы я задокументировал то, что чанки это как бы Subarray.t?  Не знаю, теоретически можно.  Но я считаю это ненужным, ибо набигут эксплуатировать и вообще превентивно совершать этосамое.  Фу.
А насчёт случаев, когда не превентивно -- мы (ты в том числе, если надо будет) заделаем таки модуль Subshit ( = Sub{array,string} )с рантайм-проверками на то, массив это или строка.  Если не peek >>= junk, то навряд ли просядет где-то, ибо вообще есть смысл "логическими единицами" обрабатывать.
S.drop_while -- для того, чтобы снизить "архитектурный оверхед" на пропускание ненужных элементов.  Если кому-либо это интересно, сообщите об этом явно.
[23:50:33] <ermine> gds: я замахнулась на 4 парсера - два маркапа, один хмль и один - бинарный, гит, вот буду ныть-то, что ой
[23:57:04] <gds> ermine: прикольно тебе.  Ну учитывай, что ту шнягу, которую можно распарсить, елозя по подмассиву, лучше оформлеять как "простой итерат", кушающий чанк, а ту, которой надо доступ к самому массиву, надо в Subarray пхать.  Но не пхать слишком дохрена -- от этого модуль раздувается и ему в будущем грозит несварение.  Ну и вообще, разбивать задачу так, чтобы потоковый парсинг помогал, а не мешал.  Потому что с не-потоковым у меня пока бида.  recoverable errors надо изучить (в том числе, как они живут с bind), но руки не доходят.  Так и живём.
[23:59:27] <ermine> да дело у меня уже едет как по маслу
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!