Home
Objective Caml
ocaml@conference.jabber.ru
Воскресенье, 26 июня 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:11] <ermine> кстати, я тут усмотрела бэктрекинг
[00:01:31] <ermine> в heads он есть
[00:02:24] <ermine> правда, в пределах одного чанка это может и клево
[00:03:00] <gds> бектрекинг в пределах чанка -- фу и говно, ну честно.
[00:04:18] <gds> в пределах одного элемента входа -- он есть, ибо итерат без наличия хотя бы одного элемента не попросят выйти на сцену.  А вот гарантировать больше одного -- да никак.  Представь, что над делом работает хитрый enumerator, который по одному элементу впаривает.
[00:04:31] <ermine> а там прилагаются большие усилия, чтобы поделить чанк на h,t?
[00:05:54] <gds> ну зачем тебе на h::t делить?  В принципе, 2*4 слова выделить надо (2*3 без учёта заголовков), ну и пара вызовов функций.  Нибида, но на каждый элемент -- я бы не стал без особых причин.
[00:07:38] <ermine> ну, h::t - это S.destruct_first_item
[00:08:00] <ermine> может и правда уже начать ковыряться в субмассивах
[00:09:32] <gds> про деление на h::t -- правильно нашла.  Пробовал писать так, чтобы вопросов не возникало -- с именами, заменяющими каменты, и всё такое.  А учитывая, что скоро спатке и всё такое, и хз когда проснусь, исподники будут самым надёжным источником информации.
А subarray.ml -- оно простое.  Учитывая, что подобное (для массивов, строк, фифобуферов, очередей) я писал в сумме более десятка раз, оно уже пишется автоматически.
[00:12:20] <gds> имею ввиду, что и читаться по идее должно автоматически.
/me => в сторону спатке
[00:12:24] gds вышел(а) из комнаты
[00:12:30] <ermine> да, спать пора, ибо я тут уже втупилась:
let spaces =
  let is_space c = c = ' ' || c = '\t' in
    element is_space >>= function
      | true -> drop_while is_space
      | false -> ?
          
[00:12:37] <ermine> ых, смылся
[00:12:57] <ermine> ну тогда я тоже того
[01:11:53] ermine вышел(а) из комнаты
[03:04:29] bobry вышел(а) из комнаты
[03:19:42] zinid вошёл(а) в комнату
[11:30:04] ermine вошёл(а) в комнату
[13:39:29] bobry вошёл(а) в комнату
[13:42:04] gds вошёл(а) в комнату
[13:43:05] <gds> ermine: а что функция spaces должна делать?
[13:50:36] <ermine> gds: удостовериться что тут есть пробел и скипнуть еще немного пробелов
[13:51:03] <gds> удостовериться?  а если пробелов нет?
[13:51:10] <ermine> gds: но я подумала потом и решила, что это не так уж критерично в нестрогой формализации
[13:52:05] <ermine> gds: ну вот там стоит вопросительный знак
[13:52:41] <ermine> в строгой формализации всяко ошибку надо кинуть и отказаться жрать дальше
[13:53:17] <ermine> gds: кстати, об ощибках, а как пристегнуть сюда line 1, col 20?
[13:56:05] arhibot вошёл(а) в комнату
[14:00:25] <gds> line-col -- буду думать.
а вопросительный знак в подобных описаниях -- это ведь "необязательный элемент"?
[14:01:35] <ermine> gds: надо, чтобы Location был определен лишь тогда, когда он действительно нужен, в случае бесконечных потоков он вряд ли имеет смысл
[14:03:43] <ermine> не, вопросительный знак как раз вопрос, что писать дальше
[14:04:35] <ermine> но я уже переписала ту функцих, и не только ее
[14:07:20] <ermine> насчет Location - можно поглядеть как в camlp4 мухлюют с этим
[14:15:36] <gds> ermine: концептуально с location всё ясно: либо 1. делается комбинатор, который передаёт чанки итерату, сам следя за тем, где какие строки начинаются, и если в ответ на последний переданный чанк ошибка, то оборачивающий ошибку в E_located_at filename linenum colnum orig_error, где все параметры берутся из начала переданного чанка, либо 2. всё разбирается до уровня токенов (иначе слишком дофига оверхед), и при разборе каждый токен заворачивается в структуру, содержащую кроме токена ещё location.
[14:17:45] <ermine> интересная идея
[14:18:00] <ermine> итерат сидит на итерате и погоняет итератом
[14:18:09] <gds> п.2 -- это не моя идея, это как раз из camlp4.
[14:18:27] <ermine> тут даже приятная фишка в том, что такой итерат можно вставить перед декодингом стрима
[14:20:49] <gds> ты про п.1?
[14:21:00] <ermine> ага
[14:21:12] <ermine> второй пункт все же посложнее будет
[14:21:42] <ermine> хотя в случае xml из файлов - это сразу и токены, и location
[14:21:50] <ermine> но там тоже декодинг
[14:27:07] <gds> п.2 -- концептуально проще, но "оверхед" -- считай, каждый токен заворачивать, это же удолбаться можно разворачивать при работе с ними.
а вот п.1 -- более "хакирский", и его минус в том, что он только один location даёт, и только при ошибке.  Но есть и приятная штука: можно разобраться с recoverable errors и сделать "хук" до комбинатора, чтобы он возвратил текущее положение и продолжил выполнять итерат дальше.  Но у меня руки не доходят разобраться с recoverable errors.
[14:38:42] <ermine> попинаем потихоньку
[14:41:40] arhibot вышел(а) из комнаты
[14:41:48] arhibot вошёл(а) в комнату
[14:43:47] <gds> ermine: и ещё, повторю внушение: старайся везде использовать функции, работающие с блоками данных, нежели с отдельными символами.  Чтобы потом не кусать себя за одноместо по поводу производительности.
[14:45:15] arhibot вышел(а) из комнаты
[14:45:39] <gds> но сами функции, через которые основное записываешь, пока могут работать хоть через peek + drop -- главное, чтобы можно было потом их записать в виде операций над массивами.
[14:45:55] arhibot вошёл(а) в комнату
[14:46:23] arhibot вышел(а) из комнаты
[14:54:46] <ermine> gds: ага, это я знаю :), уже есть идеи как компоновать в блоки
[14:55:34] <ermine> главное чтобы не удолбаться в выписывании итератов на каждый чих
[14:58:38] <gds> ermine: количество разных итератов прямопропорционально сложности громатеки.
[15:02:00] <ermine> gds: нет, количеству токенов
[15:03:48] <gds> для парсинга стапятисот токенов, каждый из которых "слово" (\S+), нужно стопиццот итератов?
[15:05:10] <ermine> нене
[15:06:02] <ermine> а вот если токен - это [A-Z][a-z]+ например, другой токен  [A-Z_][a-z], то это уже другой итерат, копающийся в отдельном блоке
[15:06:25] <ermine> забыла знак плюса во втором случае
[15:07:43] <gds> да, если доводить до копания в чанках, это разные итераты.
[15:07:50] <ermine> добавим еще один итерат, который выдает токен [A-F][a-z1-9]*
[15:09:54] <ermine> но тут у меня есть слабые идеи насчет того, чтобы просто делать функции работы с чанками типа opt_f, plus_f, star_f, берущие в качестве аргумента функцию проверки диапазонов и еще какие-то телодвижения придумать для унификации
[15:12:30] <gds> вот в случае opt -- надо таки "контролируемый бектрекинг".
[15:14:56] <ermine> ыгы, я хз как разруливать ситуацию [a-z][1-9]? в случае (Chunk "a"), (Chunk "z")
[15:15:45] <ermine> но тут похоже нет бэктрекинга
[15:16:06] <ermine> возвращаешь тот же чунк, который не понравился
[15:16:20] <ermine> а ты о какой ситуации?
[15:16:59] <gds> я о ситуации, когда ждём "(abc)?", но в текущем чанке только "ab".
[15:17:32] <gds> интересно, есть ли какой-нибудь простой парсер, который отличается тем, что в ответ на каждый следующий чанк выдаёт какое-нибудь своё состояние, из которого можно выцепить список возможных вариантов распарсенного, например?  Думаю glr толково посмотреть, он вроде простой и как раз "такой".  Но моего мозга кастратофически не хватает.
[15:19:12] <ermine> parsec?
[15:20:58] <ermine> а мне бы дочитать ту книжечку про парсинг
[15:26:22] <ermine> gds: я чота не пойму функции lift в итератах, там не видно от чего монада исполнится
[15:26:41] <ermine> value (lift : IO.m 'a -> iteratee 'el 'a) m =
  IE_cont None (fun s -> m >>% fun x -> IO.return (return x, s))
;
[15:27:39] <ermine> точнее сбивает с толку, что s возвращается неповрежденным
[15:29:55] ygrek вошёл(а) в комнату
[15:30:03] <gds> lift -- просто заворачивает io-действие в итерат.  То есть, при поступлении чанка io-действие совершается ("m >>% ..."), его результат x возвращается так, как всегда возвращается в итератах результат из cont, а чанк возвращается неповреждённым потому, что у нас не было нужды его читать.  То есть, его возврат -- гарантия того, что lift совершит только io-действие, но по отношению к монаде iteratee будет нейтрален.
[15:30:08] ygrek вышел(а) из комнаты
[15:30:27] ygrek вошёл(а) в комнату
[15:35:15] <ermine> кажись поняла
[15:37:22] <gds> мне бы кто так объяснил в своё время...
с другой стороны, можно брать чатлоги и выпускать книжку "итераты для самых маленьких" в трёх томах.
[15:38:54] <ermine> yt
[15:38:56] <ermine> не
[15:39:02] <ermine> итераты для девочек
[15:39:08] <zinid> гг
[15:40:37] <gds> "Каждая юная леди перед сношением с монадным вводом-выводом должна иметь представление об итератах.  Существует множество мифов вокруг них, и на страницах нашего гламурного журнала мы развеем их."
[15:43:14] <ermine> gds: запиши этот абзац куда-нить, а то забудешь им начать статью
[15:43:15] <gds> "Многие говорят, что это больно, неприятно, и вообще аморально, однако это не так."
[16:44:51] komar вышел(а) из комнаты: Replaced by new connection
[16:44:51] komar вошёл(а) в комнату
[16:55:36] arhibot вошёл(а) в комнату
[16:55:56] arhibot вышел(а) из комнаты
[17:14:54] <ygrek> gds: на forge есть ocaml-inspect
[17:16:26] <gds> ygrek: о блин, круто!  Буду знать.  Пока решил проблему "на глаз", но в будущем пригодится.
[17:17:12] <ygrek> мне тоже такая штука периодически нужна, чтобы ковырять камлевые значения в дампах
[17:17:21] <ygrek> в gdb было бы хорошо
[17:18:56] <ermine> ygrek: а ты уже написал свой первый итерат?
[17:29:48] arhibot вошёл(а) в комнату
[17:29:59] arhibot вышел(а) из комнаты
[17:32:55] arhibot вошёл(а) в комнату
[17:39:14] arhibot вышел(а) из комнаты: Replaced by new connection
[17:39:15] arhibot вошёл(а) в комнату
[17:51:12] arhibot вышел(а) из комнаты
[17:58:54] komar вышел(а) из комнаты
[17:59:15] komar вошёл(а) в комнату
[18:02:01] zert вошёл(а) в комнату
[18:09:16] arhibot вошёл(а) в комнату
[18:09:24] arhibot вышел(а) из комнаты
[18:13:05] <ygrek> ermine: не
[18:13:32] <ygrek> пока не надо было
[18:14:18] <ygrek> ragel умеет чанками лексить, а абстракцию сверху накручивать незачем было
[18:15:42] <gds> если всё через рагуль решается, то повезло.
[18:18:55] <ermine> всё решается?
[18:19:53] <gds> от задач зависит.
[18:22:20] <ermine> вот интересно, что рагелем не решается
[18:26:45] <zinid> ermine: элементарный http uri не распарсишь им
[18:27:04] <zinid> ermine: там придётся навешивать всякую муть типа приоритетов
[18:27:13] <zinid> я так и не разобрался, проще вручную
[18:28:40] <ermine> о, опять урл
[18:28:58] <ermine> zinid: а какую доку ты читал, чтобы парсить урл?
[18:29:13] <zinid> ermine: а есть какой-то rfc
[18:29:27] <ermine> ладно
[18:29:37] <zinid> у рагеля едет крыша от вот такого: http://user:password@host:port
[18:30:09] <ermine> о
[18:30:51] <ermine> а мне еще и без бэктрекинга решать это, ибо gds запретил их
[18:31:10] <ermine> впрочем тут поиск @
[18:31:27] <zinid> его может и не быть
[18:31:32] <zinid> http://host:port
[18:31:44] <ygrek> > элементарный http uri не распарсишь им
ы?
[18:31:46] <zinid> то есть бегать туда-сюда придётся
[18:31:46] <ygrek> там даже в примерах есть
[18:32:38] <ermine> zinid: ну если нету собачки - значит нет секции логина
[18:33:06] <ygrek> no magic, как ни парсь всё равно надо определять есть логин или нет, итп
[18:33:16] <ygrek> ragel это просто удобный способ описывать fsm
[18:33:25] <zinid> ага
[18:33:41] <zinid> я ragel юзаю для проверки допустимых символов ;)
[18:33:50] <zinid> а переходы делаю вручную
[18:33:55] <ermine> http::/ (string_till?_@) (uri)
[18:34:09] <ermine> ой
[18:34:17] <ermine> http::/ (string_till_@)? (uri)
[18:34:56] <ermine> zinid: а тебе надо получать все части отдельно или весь урл целиком строкой?
[18:35:10] <zinid> ermine: все части отдельно
[18:35:42] <zinid> более того, мне нада парсать и абсолютный тоже
[18:35:52] <zinid> sip:user@server;transport=tls
[18:36:12] <zinid> sip://user@server:port;transport=tls/a/b?header=x
[18:36:41] <zinid> это примеры ахтунгов
[18:37:20] <ermine> точка с запятой вместо слэша? а бывает?
[18:37:37] <zinid> ну в http вроде нет
[18:37:46] <zinid> а в radius-uri бывает
[18:37:56] <zinid> aaa://blah.com;transport=tcp
[18:38:23] <ermine> не, мне это не грозит :)
[19:24:16] <gds> http://caml.inria.fr/mantis/view.php?id=5301 , и как я только на такое наступаю.
[19:29:50] ygrek вышел(а) из комнаты
[19:42:30] ygrek вошёл(а) в комнату
[19:56:20] <gds> чото туплю.  Вот такое -- http://paste.in.ua/2647/ -- при условии, что сделал ocamlbuild -clean везде и ocamlfind remove;install для iteratees, чем вообще может быть вызвано?
[19:58:12] <ygrek> реинсталлил точно ту версию?
[19:58:41] <ygrek> amdoing_db.cmi -> XXX -> iteratees.cmi ?
[19:59:12] <ygrek> депы cmi это же транзитивное замыкание всех депов
[19:59:20] <ygrek> так что пересобирай world :)
[19:59:25] <ermine> итераты изменили интерфейс
[20:00:10] <ermine> а db не перекомпилился
[20:01:09] <ermine> хм, amdoing звучит увлекательно
[20:01:12] <gds> реинсталлил -- без оазиса, так что "точно та версия".  или я неправильно понял?
[20:01:50] <ygrek> лучше проверь
[20:01:52] <gds> во, насчёт транзитивного замыкания думал, предполагал, но проверять геморно было, спросить проще.  Видимо, это оно.  Сейчас попробую.
[20:01:56] zinid вышел(а) из комнаты
[20:03:10] <ermine> без оазиса не знаю, ставит ли камлофинд все .cmi
[20:04:02] <gds> я их руками ставлю (и периодически забываю, как с pure_IO.cmi, но пофиксил уже).
[20:08:59] ygrek вышел(а) из комнаты
[20:09:04] ygrek вошёл(а) в комнату
[20:25:16] <gds> переустановил всё, что можно, и ошибка ушла.  Таки грешу на транзитивные зависимости, хотя в теории возможен более тонкий эффект.  Кстати, мета-репка со скриптами для пересборки называется у меня "rebildol".  Эдакое лекарство, если на слух.
[20:33:19] ygrek вышел(а) из комнаты: Replaced by new connection
[20:33:20] ygrek вошёл(а) в комнату
[20:48:10] <gds> ermine: enum_string -- http://paste.in.ua/2648/
[20:49:24] <gds> ermine: и вопрос на засыпку, будет интересно разобраться: почему там, в ">>% fun (it, _s)" я говорю, что остаток потока не важен (и по факту не использую _s нигде дальше)?
[20:55:20] <ermine> какой громоздкий енум
[20:57:29] <ermine> вот насчет Array.make я таки прогнала, мне чота казалось, что там дается функция инициализации, а не дефолтное значение
[21:04:42] <ermine> не, я это разжевать пока не
[21:05:59] <gds> громоздкий, но подаёт строку по кускам, чтобы по памяти не проседало в плохих случаях.  Однако в остальном он весьма простой, и рекомендую его как пример, когда будешь енумераторы щупать.
[21:08:00] <ermine> по частям - это я вижу, поэтому там _s не нужен, но вот непонятно что будет, если там действительно остаток есть
[21:11:09] <ermine> gds: ты это включишь в либлу?
[21:11:50] <gds> включу обязательно.
[21:12:06] <gds> как докодю ещё кое-что и как увижу, что в конкретной софтине оно работает.
[21:13:01] <ermine> а я щас начала лазить грязными руками в subarray в своем коде
[21:13:40] <ermine> правда, сегодня великая хандра меня одолевает, а выпить нечего
[21:14:59] <ermine> gds: кстати, у тебя там везде i+1, а я юзаю succ i
[21:15:18] <ermine> я просто надеюсь, что оно где-то там более оптимизированное чем i+1
[21:15:22] <gds> ermine: про _s -- это называется "хорошие итераты" -- если они возвратили IE_cont None _, то обязаны скушать весь чанк целиком.  Поэтому, если они вернули IE_cont None _, то остаток пустой, и мы его игнорируем, и следующий цикл кормёжки начнём с символов, которые ещё не обработали.  Если же остаток непуст, то хорошие итераты должны вернуть IE_done _ или IE_cont (Some _) _, и в следующем вызове этот итерат вернётся в качестве результата енумерации (то есть, остаток уже реально не нужен, смело выбрасываем).
[21:15:55] <gds> про succ -- наверное правильно, не знаю.  Идеологически -- точно правильнее.
[21:15:57] ygrek вышел(а) из комнаты
[21:16:15] ygrek вошёл(а) в комнату
[21:18:09] <ermine> gds: вот это про "хорошие" итераты меня иногда тут напрягает, что надо доверяться кому-то
[21:19:31] <gds> если какие-то казлы писали "плохие" итераты, они не смогут нормально работать с твоим енумератором.  И, скорее всего, их словят, рано или поздно.  Но негарантированно.  Это печально.
[21:27:11] <ermine> gds: а еще меня напрягает Chunk ""
[21:27:21] <gds> а чего напрягает?
[21:27:54] <ermine> под него надо подстраиваться при работе со строчной грамматикой, в которой есть пустые строки
[21:28:54] <ermine> причем пустая строка \r\n\s*\r\n одним чанком вряд ли всегда определится
[21:29:08] <ermine> а если определится, то чо с этого
[21:29:38] <ermine> пока до этого не добралась :)
[21:33:54] <ermine> а, уже поняла
[21:34:11] <ermine> следующий итерат должен быть соответствующим
[21:34:15] <gds> если токены будут, то будет Chunk [| ... ; "" ; ... |], но никак не Chunk [| |]
[21:36:44] ermine мучается уже с другой засадой: эскейпинг \*, разрыв случился посередине
[21:38:57] <ermine> придумала
[21:39:00] <ermine> хех
[21:39:17] <gds> недопонял.  Но в некоторых случаях можно сначала разбить на токены, а потом по ним.
[21:40:06] <ermine> Chunk "abc\", Chunk "*def"
[21:41:20] <ermine> необычное дело - вернуть в итерат калбэк с работы с subarray для следующего шага
[21:42:41] <gds> работать будет, но не нравится мне это жутко.
[21:44:11] <ermine> gds: а эта паста требует регистрации?
[21:44:14] <gds> не
[21:46:51] <ermine> http://paste.in.ua/2649/
[21:49:07] <ermine> я поторопилась ее пастануть :)
[21:49:22] <ermine> надо проверять i в aux_escaped
[21:50:09] <gds> так вроде проверяешь на  = s.len?
[21:51:30] <ermine> я имела в виду, что надо вернуть кусок до \
[21:52:03] ftrvxmtrx вышел(а) из комнаты
[21:52:03] <ermine> но суть не в этом
[21:52:15] <gds> посмотрел, продолжения возвращаешь только на границе чанка -- это грамотно.
[21:52:18] <ermine> просто идеология вот такая вот, а чо тебе не нравится?
[21:52:33] <gds> думал, на каждый символ возвращаешь.  А так -- скорее даже нравится.
[21:52:38] ftrvxmtrx вошёл(а) в комнату
[22:12:34] ftrvxmtrx вышел(а) из комнаты
[22:14:15] ftrvxmtrx вошёл(а) в комнату
[22:19:58] <ermine> gds: а нету готовой функции конвертации subarray в строку?
[22:20:19] <ermine> в пюре ио наверное надо смотреть
[22:21:16] <ermine> не, пюре ио тупо как пробко
[22:21:47] <ermine> чота я подумала про функцию оутпут ту оутпут
[22:21:49] <gds> S.to_string
[22:22:00] ygrek вышел(а) из комнаты
[22:22:08] <ermine> наподобие Buffer.output_channel
[22:22:42] <gds> недопонял последнее.
[22:23:24] <ermine> вывести полученный кусок чанка куда надо :)
[22:23:44] <ermine> ну это наверное завихрения фантазии
[22:24:27] <gds> ну а чего бы и нет.
[22:25:53] <gds> когда-то писал итерат break_copy, который как break, но копировал в output_channel всё встреченное.  Это для раскрытия ${переменных} надо было, кажется.
[22:27:48] <gds> кстати, думаю про то, что можно было бы представлять S.t как подмассив в одном случае и как подстроку в другом.  Конечно, слегка оверхед -- в каждое обращение к S.t добавить проверку типа: подмассив или подстрока это, но там, где массивный ввод-вывод, это скорее помогло бы.
[22:30:24] <ermine> gds: уж лучше бы модулями мухлевал
[22:31:07] <gds> не получится, если не ограничивать модель настолько, что она будет неюзабельной.  Однако, если будет конкретика, обсудим.
[22:32:34] <ermine> gds: тогда выводи в итераты определенного типа подстроки :)
[22:33:21] <ermine> итераты - сплошное издевательство
[22:33:23] <gds> думал, но будет либо неинтересно, либо столько же проверок.
[22:34:48] <ermine> зачем проверки, если у них другой тип стрима будет
[22:34:53] <ermine> монады же
[22:37:02] <gds> ты хочешь отделить итераты, которые кушают char, от остальных?
[22:38:27] <ermine> нуу
[22:39:04] <ermine> хз
[22:39:32] <ermine> а как сейчас организовать итераты, которые кушают char, и итераты, которые кушают токены?
[22:40:00] <gds> а я -- не хочу вот.  Та же перекодировка в utf8, который по недоразумению называется в окамле не char, это уже выход за "итераты, кушающие char".
[22:40:17] <ermine> камлевый Stream ведь это делает
[22:40:26] <gds> сейчас -- всё в Subarray.t хранится.  array of char и всё такое.
[22:40:41] <gds> Stream делает, но в частных случаях и с той рантайм-проверкой, о которой говорю.
[22:41:56] <ermine> а, теперь поняла
[22:42:31] <gds> многие знаньица -- многие пичальки...
[22:45:52] <ermine> у меня их пока нет, по-прежнему смотрю в код итератов и копипастю
[22:46:07] <gds> да я про рантайм-проверки.
[22:46:55] <ermine> ну при работе с камлевым Stream юзер с этим не сталкивается
[22:53:19] <gds> вот и я так же хотел сделать.  но процессор сталкивается с лишней рантайм-проверкой и разыменованием ссылки.
[22:58:21] <ermine> вставь в рекорд
[23:04:09] <gds> недопонял, куда и что вставить.  Скрыть данные (подмассив и подстроку) и вывести апи для работы с ними?
[23:05:56] <ermine> не знаю :)
[23:12:50] <gds> так можно было бы сделать, но теряется возможность работы с сырыми чанками, какая есть сейчас и коей ты воспользовалась при разборе \* или чего-то подобного.
[23:16:00] <ermine> модулями бы: мрлуоями
[23:36:12] <ermine> gds: а ты можешь объяснить, зачем в iteratees.ml рядышком стоят строки
module Subarray = Subarray
module S = Subarray
?
[23:37:49] <gds> да.  Дело в том, что внутри модуля хочется иметь короткие имена S.func, а в наружу давать Subarray таки.  Вообще, с функторами меня очень достала история пару месяцев назад, и я решил, что если работать с итератами, то передавать один модуль, содержащий и Subarray, и It_IO, и собственно сами итераты.
[23:49:55] <ermine> а мне приходится инклюдить модуль итератов, чтобы у себя тоже выбирать ио
[23:52:03] <gds> выбирать -- как?
[23:53:03] <ermine> прямым попаданием в код
[23:56:51] <gds> Iteratees.Make(твоё_Ё) -- не?
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!