Home
Objective Caml
ocaml@conference.jabber.ru
Пятница, 6 января 2012< ^ >
ygrek установил(а) тему: OCaml / ОКамл / Камль -- http://caml.inria.fr | http://camlunity.ru/ (теперь с git доступом!) | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ | Fight FUD with fire
Конфигурация комнаты
Участники комнаты

GMT+4
[00:16:17] <gds> bobry: а про гуглодок -- чото пропустил мысль.  так скопировать можно, расшарить, там и каментить.  потом я эти каменты сгребу и уточню, чо как.  да или чятик, вон, простаивает без трафика.
[00:16:37] komar вышел(а) из комнаты: Replaced by new connection
[00:16:37] komar вошёл(а) в комнату
[00:17:34] <bobry> ну, лучше в гуглодок думаю, в чатике это все будет размазано по хистори
[00:19:17] <bobry> хотя там код будет плохо читаться
[00:20:33] <gds> текстовый файл, моноширинный шрифт, <80 столбцов -- вот залог одинакового вида текста и кода везде.
[00:21:50] <bobry> :)
[00:36:32] <gds> скинул в гуглодоки, https://docs.google.com/document/d/1NHtDwEGKmYVqFlyvdGJf_VKx2tAkD9MWSDA9-X9Bers/edit
[00:52:40] <Typhon> интересно, гуглодок в инстапепер добавляется? вот битбакетное я добавил, и потом с девайса читал %)
[01:00:04] <gds> ой хз, этот пепер не использовал.  Впрочем, если тебе просто читать и делать заметки в текстовый файл / в жаббер, то бери битбакет.
[01:32:18] qrntz вышел(а) из комнаты
[02:10:16] Kakadu вышел(а) из комнаты
[03:02:21] savikov вышел(а) из комнаты
[03:02:23] savikov вошёл(а) в комнату
[03:02:47] <Typhon> http://blog.ezyang.com/2012/01/why-iteratees-are-hard-to-understand/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ezyang+%28Inside+245s%29&utm_content=Google+Reader
[03:02:49] <Typhon> (чортов гуглеридер :-( )
[04:04:17] letrec вошёл(а) в комнату
[04:04:18] letrec вышел(а) из комнаты
[04:04:33] letrec вошёл(а) в комнату
[04:47:05] savikov вышел(а) из комнаты
[05:15:23] komar вышел(а) из комнаты: Logged out
[05:15:26] komar вошёл(а) в комнату
[05:30:24] letrec вышел(а) из комнаты
[05:31:15] gds вышел(а) из комнаты: Replaced by new connection
[05:31:16] gds вошёл(а) в комнату
[08:15:37] komar вышел(а) из комнаты: Replaced by new connection
[08:15:37] komar вошёл(а) в комнату
[08:40:43] Typhon вышел(а) из комнаты
[09:35:01] ermine вошёл(а) в комнату
[11:32:01] Kakadu вошёл(а) в комнату
[11:50:24] komar вышел(а) из комнаты: Replaced by new connection
[11:50:24] komar вошёл(а) в комнату
[11:57:23] <gds> "Old copies of the iteratee state can be kept around, and resumed later as a form of backtracking (swapping a bad input for a newer one)."
мысль новая для меня, никогда её не думал.  впрочем, на практике вроде не очень полезно.
[12:02:08] ermine улыбается
[12:03:44] <ermine> gds: мысль-то не новая, а наивно-лобовая
[12:05:19] <gds> но, всё же, мало пользы от неё.  другой инпут подсовывать -- откуда его возьмёшь?
[12:05:47] <ermine> gds: попроси чувака привести развернутый пример пусть на псевдокоде, зачем ему понадобилось в такой форме замораживать итераты
[12:06:03] <gds> нет смысла.
[12:06:39] <ermine> один из примеров - как раз пакрат
[12:07:09] arhibot вошёл(а) в комнату
[12:07:13] arhibot вышел(а) из комнаты
[12:07:17] <gds> там подсовывают другой инпут?
[12:08:08] <ermine> в пакрате инпут жуется весь до конца еще на фазе запуска программы
[12:08:38] <ermine> потом делаешь вид, что парсишь
[12:08:40] <gds> там подсовывают или нет?
[12:11:32] <ermine> gds: бэктрекинг в данном случае предполагается, что строка инпута в данный момент будет та же, поэтому наверное не будут сбиваться переходы по позициям (в пакрате переходы по позициям)
[12:12:12] <gds> то есть, мы говорили про разные вещи.  бэктрекинг -- не то же самое, что "подсунуть другой инпут сохранённому итерату".
[12:12:37] <ermine> возможно
[12:12:47] <ermine> просто я увидела ключевое слово - бэктрекинг
[12:13:38] <ermine> а в итератах у тебя сплошные парсер-комбинаторы, что, если не уследишь за ними, сделают тааакой бэктрекинг, что только туши свет
[12:15:20] <ermine> а итераты без идеи "подсунуть другой инпут" - это уже не итераты
[12:15:22] <gds> не, тут другое чувак предлагает, не бэктрекинг.
а про нормальный бэктрекинг -- тут толком не знаю, как сделать.  из относительно разумного -- ставить метку и несколько вариантов парсинга, в каждый вариант передавать эту метку, и кто первый сказал, что до этой метки всё распарсил нормально, того и возвращать.
[12:19:04] <ermine> gds: вот я планирую у себя сделать lookahead - ставить в структуре чанка признак, что сейчас идет режим lookahead, а итерат, который выкачивает инпуты из сокета, смотрит на этот красный флажок и, если сейчас lookahead, то накапливает строчки у себя и в случае выхода из lookahead просто отдает проке накопленные чанки вместо того чтобы вытягивать новые из сокета
[12:19:46] <ermine> короче суть была в том, чтобы четко поделить когда происходит бэктрекинг из-за альтернатив, а когда lookahead из-за предикатов
[12:20:13] <ermine> и соответственно действительно надо лечиться от бэктрекинга в альтернативах
[12:20:41] <gds> ну вот, я примерно твой вариант и хотел сделать.
[12:21:32] <ermine> lookahead - кстати тоже не поглощает (consume) инпут, что составляет приятную особенность этой штуки
[12:23:02] ermine в данный момент упражняется в разнообразных сортировках грамматики
[12:23:26] <gds> lookahead не поглощает, но требует инпут.  пичалька.
[12:23:29] <ermine> еще блин копаться в camlp4
[12:26:14] <ermine> ну за лукахедными инпутами следить проще чем за непонятно куда уплывающими при бэктрекинге
[12:30:48] <ermine> сначала я думала ставить флажок в инпуте "заказываю тут точку бэктрегинка" и так накапливать, потом поняла, что будут проблемы с отдачей накопленного и очередностью инпутов
[12:38:55] <gds> lookahead = backtracking для одной ветки парсинга.  вроде так?
[12:45:16] <ermine> смотря какой парсинг и каким методом, если LR (bottom-up), то бэктрегинга вовсе нет в этом случае, что вынули и считаем lookahead - уже поглощено фактически, а при использовании top-down, комбинаторов для бэктрегинка запоминаем точку инпута перед входом в любую альтернативу (локальная точка бэктрекинга), тут всегда может произойти поглощение строчки (пофигу, что может и не произйоти), а при lookahead можно считать, что никогда поглощения не будет
[12:46:31] <ermine> пример: для парсинга bnf грамматики, где сложность с неопределенной концовкой правил
A ::= abc
D ::= a
/ b
c
[12:48:22] <ermine> пишем правило для парсинга этой каши
Definition <- Name "::=" Sequence+
Sequence <- Name !"::=" / somewhateverelse
[12:49:27] <ermine> вот тут !"::=" - предикат для lookahead, если удовлетворится, что Name будет отпарсено и строчка поглотится после Name
[12:51:05] ermine давно слышала, что парсить bnf невозможно, но долго не понимала, в чем проблема
[12:53:22] <ermine> в некоторых местах предлагали ставить точку с запятой в конце правил
[12:54:36] <ermine> в GLR можно вроде просто перетащить в стэке отпарсенные токены туда-сюда и засабмитить правило без лишних токенов
[12:55:00] <ermine> но опять-таки бэктрекинга тут нет, позиции в инпуте не передвигаются и не восстанавливаются
[12:55:39] <ermine> gds: хоть что-то понял в моем сумбуре?
[12:57:19] <gds> ermine: приблизительно да, там, где было важно.
[12:59:39] <ermine> хех
[13:07:44] letrec вошёл(а) в комнату
[13:07:47] letrec вышел(а) из комнаты
[13:08:02] letrec вошёл(а) в комнату
[13:19:39] komar вышел(а) из комнаты: Replaced by new connection
[13:19:40] komar вошёл(а) в комнату
[14:10:56] dzhon вышел(а) из комнаты
[14:29:30] komar вышел(а) из комнаты: Replaced by new connection
[14:29:31] komar вошёл(а) в комнату
[14:54:00] shaggie вошёл(а) в комнату
[15:16:28] iNode вышел(а) из комнаты
[15:49:22] komar вышел(а) из комнаты: Replaced by new connection
[15:49:23] komar вошёл(а) в комнату
[17:26:34] komar вышел(а) из комнаты
[17:39:49] ftrvxmtrx вошёл(а) в комнату
[17:56:44] f[x] осознал потребность в ocaml lint
[17:58:23] <gds> а что случилось?
[17:59:26] <f[x]> случился ещё один камлопогроммист на работе :)
[17:59:32] <f[x]> надо mascot затестить
[18:01:14] <gds> я так и думал.
[18:36:46] <ermine> ить, где-то берут окамлистов на работу?!
[18:53:21] <f[x]> дык
[18:59:04] <ermine> ниверю!!!
[19:21:57] <letrec> Unix.out_channel закрывать не надо? что-то не могу найти функцию соответствующую
[19:27:40] <Kakadu> letrec: а как ты его создавал?
[19:27:55] <letrec> out_channel_of_descr
[19:29:22] <Kakadu> я хз но может Unix.close?
[19:29:28] <letrec> нашёл
[19:29:40] <letrec> close_out
[19:29:49] <letrec> оно в другом модуле
[19:33:32] <ermine> и опенишь его open_in?
[19:34:51] <ermine> тупо мыслим, говорим про парные функции открытия и закрытия
[19:58:52] <letrec>   let chan = Unix.out_channel_of_descr fd in
  ...
  let () = flush chan in
  close_out chan
[20:38:37] Typhon вошёл(а) в комнату
[21:00:12] <letrec> как сделать чтобы
let exec (f : 'a -> 'b) (value : 'a) : 'b =
  match 0 with
    | 0 -> f value
    | 5 -> ()
типизировалась как указано в сигнатуре, а не ('a -> unit) -> 'a -> unit?
[21:01:32] <letrec> так
let exec (f : 'a -> 'b) (value : 'a) : 'b =
  match 0 with
    | 0 -> f value
    | 5 -> failwith "adas"
[21:01:58] <letrec> вроде типизируется как требуется, но мне там исключения не впёрлись
[21:03:16] <letrec> т.е. хочется ('a -> 'b) -> 'a -> 'b
[21:06:51] <gds> letrec: а как можно из кода, который возвращает либо f value, либо (), вывести, что его тип будет всегда типом, который возвращает f value?
[21:07:32] <letrec> походу никак, вот я и пытаюсь понять как это сделать
[21:08:15] <letrec> почему компилятор болт кладёт на сигнатуру? я её неправильно задал?
[21:09:35] Typhon вышел(а) из комнаты: Replaced by new connection
[21:09:37] <letrec> или так: почему он выбирает (), а не 'b?
[21:09:39] Typhon вошёл(а) в комнату
[21:09:41] <gds> сигнатура, если её задавать в виде простых 'a, 'b, имеет ограничительный смысл -- она ограничивает типы, но: 1. не форсирует то, что типы 'a и 'b обязаны быть разными, 2. не говорит, что функция обязана типизироваться для любых 'a и 'b.
[21:10:03] <gds> unit оно выбирает унификацией веток "f value" и "()".
[21:10:44] <gds> если бы было не unit, то () по типам не прошла бы ветка ().
[21:11:15] Typhon вышел(а) из комнаты: Replaced by new connection
[21:11:15] <gds> тьфуты, криво сформулировал, но, думаю, понятна мысль.
[21:11:18] Typhon вошёл(а) в комнату
[21:11:20] <letrec> да
[21:11:45] <letrec> поведение компилятора понятно, но непонятно как добиться желаемого эффекта
[21:12:04] <gds> если нужен явный полиморфизм и есть >=3.12, то есть сигнатуры вида
let exec : 'a 'b . ('a -> 'b) -> 'a -> 'b = fun f value -> ...
[21:12:14] <letrec> у меня там fork в оригинале - т.е. тип результата ветвления разный
[21:12:55] <gds> так fork ведь всегда int возвращает.
[21:13:06] <gds> а, понял.
[21:13:11] <letrec> ага
[21:14:02] <letrec> я пытаюсь написать запускалку функций в другом процессе
[21:16:23] <gds> тогда надо продумать чуть дальше -- что делать в исходном процессе, что делать в функции?  если функция чисто для сайдэффектов, возвращать везде unit нормально.  если возвращает результат, то как его передать родителю?
[21:17:37] <letrec> я его передаю через memory mapped file используя Marshal
[21:17:48] <letrec> результат
[21:18:29] <letrec> могу код функции запэйстбинить, если надо
[21:18:49] <letrec> но она сводится к вышеприведённой проблеме
[21:19:39] <gds> результат передаётся взад в этой же функции, которая вызывает fork?
[21:19:55] <letrec> да
[21:20:23] <gds> потомок остаётся жить и надеяться на будущее или умирает тут же?
[21:20:39] <letrec> умирает сразу
[21:20:44] <letrec> т.е. использование должно выглядеть как let v = fork_exec String.capitalize "Hi!"
[21:21:09] <gds> тогда в потомке достаточно сделать exit (который int -> 'a) и этот самый 'a унифицируется хоть с чортом лысым.
[21:22:02] <letrec> bingo!!!
[21:22:11] <letrec> спасибо
[21:22:24] <gds> для гарантий того, что унифицируется -- синтаксис " 'a 'b . остальной_тип " -- очень полезно, но для >=3.12.
[21:22:50] <letrec> я никак допереть не мог как мне вернуть значение неизвестного типа и ничего кроме исключения в голову не приходило, хотя тоже бы работало
[21:23:28] <gds> почти работало бы -- исключения мономорфные.  пришлось бы в модуль заворачивать (first-class либо функтор).
[21:23:42] <letrec> можешь развернуть " 'a 'b . остальной_тип "?
[21:25:26] <gds> # let exec : 'a 'b . ('a -> 'b) -> 'a -> 'b = fun f value ->
  match 0 with
  | 0 -> f value
  | 5 -> ();;
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
1
Error: This definition has type 'a. ('a -> unit) -> 'a -> unit
       which is less general than 'b 'c. ('c -> 'b) -> 'c -> 'b
[21:28:04] <letrec> надо об этом почитать поподробнее
[21:28:59] <gds> да вроде понятно и так...
[21:52:53] <ermine> про недокомплект типов читать всегда полезно, ик
[21:53:21] ermine попила воспомогательного средства и теперь удивляется, пчу теперь в коде столько опечаток, ик
[21:54:11] <ermine> щато задачка какая, блин, выявить и обособлить рекурсивные элементы из списка
[22:13:40] <letrec> нарвался на http://caml.inria.fr/mantis/view.php?id=5463
[22:13:57] <letrec> свежак
[22:32:23] letrec вышел(а) из комнаты
[22:38:27] gds вышел(а) из комнаты: Replaced by new connection
[22:38:28] gds вошёл(а) в комнату
[22:50:53] shaggie вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!