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

GMT+4
[00:05:49] abiogenesis вышел(а) из комнаты
[00:08:52] komar вышел(а) из комнаты: Replaced by new connection
[00:08:52] komar вошёл(а) в комнату
[00:32:20] shaggie вошёл(а) в комнату
[00:47:04] Typhon вышел(а) из комнаты: Replaced by new connection
[00:47:07] Typhon вошёл(а) в комнату
[01:19:50] gds вышел(а) из комнаты
[01:27:35] shaggie вышел(а) из комнаты
[02:04:25] <komar> А где-нибудь есть хороший архив этих ваших камл-листов?
[02:04:42] <komar> А то думаю почистить чуток, сто мегабайтов — это уже слишком.
[02:08:09] <ygrek> экономишь на мегабайтах?
[02:11:02] <komar> Не критично для меня.
[02:11:44] <komar> Но так как у этого хлама нет другого применения, кроме как грепнуть какой-то очередной высер Лероя в маиллист и запастить его сюда в качестве ответа на вопрос, то почему бы его не почистить?
[02:13:08] komar записал в список бредовых идей: интерфейс для исполнения read-only-команд на вебсервере.
[02:14:22] <ygrek> ну, именно для этого, лежит, кушать не просит
[02:14:35] <ygrek> а то гугл накроется медным тазом и как тогда?
[02:14:45] <komar> Гугол не нужен.
[02:14:54] <komar> Я просил хороший архив, а не гугол.
[02:15:29] <ygrek> хороший архив - локальный архив
[02:15:55] <komar> Бида.
[02:16:06] <ygrek> са. Олег опять жгёт в рассылке
[02:16:31] <Typhon> генераторы?
[02:17:02] <Typhon> komar, http://www-personal.umich.edu/~mressl/webshell/ что-нибудь такое :-)
[02:17:39] <komar> > web-based ssh shell
тугая струя блевотины
[02:17:54] <Typhon> я знал, что тебе понравится ^_^
[02:18:02] <komar> Следующий номер нашей программы — онлайн-шифровалка PGP!
[02:18:21] <komar> Просто загрузите свой приватный ключ на сервер.
[02:18:34] <komar> ygrek: да, про локальный архив ты прав.
[02:19:10] <komar> > JavaScript and AJAX
[02:19:16] <komar> > Python
[02:19:21] <komar> Пропал мой ужин.
[02:19:59] <ygrek> komar: ты хоть от чата отворачивайся-то!
[02:21:14] <Typhon> кстати, про генераторы эти, а где delimcc.ml или что-то такое?
[02:22:12] <ygrek> http://okmij.org/ftp/continuations/caml-shift.tar.gz
[02:22:13] <Typhon> это чтоли? http://okmij.org/ftp/continuations/implementations.html#caml-shift
[02:22:17] <ygrek> угу
[02:22:18] <Typhon> ага
[02:22:54] <ygrek> delimcc я так и не осилил, yield'ы эти выглядят просто, может и сгодятся на что
[02:23:48] <Typhon> да, у меня пока просто call/cc не сказать, чтобы легко в голове лежат, а делимцц, вроде как, ещё мудрёнее. надо попробовать yield'ы .
[02:23:58] <Typhon> кстати, камло засветилось в модном бложеке http://nosql.mypopescu.com/post/8683509129/using-ocaml-from-couchdb-views
[02:46:17] Typhon вышел(а) из комнаты
[02:47:05] <ygrek> тормозит комп, заглядываю в dmesg, офигеваю, много раз в секнду логи от фаерволла про заблоканные dhcp пакеты, ip ноута, захожу на ноут - из под networkmanager'а запущено 73 dhclient'а, wtf?
[03:24:09] ygrek вышел(а) из комнаты
[03:34:26] digimmortal вошёл(а) в комнату
[04:37:49] digimmortal вышел(а) из комнаты
[05:40:34] zinid вошёл(а) в комнату
[08:15:24] mrm вошёл(а) в комнату
[09:46:51] ermine вошёл(а) в комнату
[10:41:44] gds вошёл(а) в комнату
[10:58:49] Typhon вошёл(а) в комнату
[11:47:09] <gds> дошёл до такой штуки.  Есть withres 'a 'r = { cons : 'a -> 'r; fin : 'r -> unit }.  Есть базовые withres -- withres { filename:string } in_channel например.  Можно дописывать предобработку 'a через функцию, контрвариантненькую, с типом ('a -> 'b) -> withres 'b 'r -> withres 'a 'r.  А на основании любого withres 'a 'r и key equality : 'a -> 'a -> bool вполне можно сделать мемоизацию последнего из вычисленных результатов так, чтобы при пересоздании ресурса закрывался предыдущий полученный ресурс (конечно, возможно и ручная очистка мемоизированного с освобождением взятого ресурса).  Тупо, но получается потихоньку.  А ресурсом в конкретном случае будет prepared statement с телом, вычисляемым в зависимости от содержимого данного рефа.  Присваиваем рефу что-то -- следующие обращения к базе будут включать "приготовление" нового оператора.
[12:10:48] ermine почитала очереднюю статью на janestreet и сразилась идеей оптимизировать List.map - сначала первую часть списка лопатим нехвостово, а если он велик, то лопатим остальное хвостово... чтобы типа стэк не лопнул
[12:11:00] <ermine> смешно
[12:18:28] <komar> лерой грит малаца
[12:18:45] <ermine> а еще идея - вторую часть списка мапить перегонкой через array
[12:19:24] <ermine> у лероя же только нехвостовая рекурсия
[12:20:02] <ermine> хотя в svn логе я видела какие-то странные упоминания про List.map, надо посмотреть, не изменилась ли имплементация
[12:20:15] <komar> Лерой тоже любит СКОРАСТЬ.
[12:20:53] <ermine> ага изменилась
[12:20:56] <komar> А вообще длинные списки не нужны.
[12:22:38] <ermine> в модуле List появилась функция mapi
[12:24:26] <ermine> komar: тексты у тебя слишком маленькие, иначе бы список слов не влез бы в лимит в 8k
[12:25:00] <komar> чо зойчем
[12:26:20] <ermine> komar: чтобы раскрашивать их?
[12:48:28] <gds> через массив гонять не ок.
[12:50:30] <gds> кстати, все уже видели этот боян?  Очень полезная книга при обсуждении сложных вопросов функционального программирования и особенно теории типов: http://tinyurl.com/3qp8h3r
[12:50:49] <f[x]> а кто-то знает нафига ocamlbuild на винде юзает всякие rm и mkdir вместо api? чтобы Unix не дёргать?
[12:51:28] <gds> нафига -- неизвестно, вроде бы он вполне может Unix.
[12:52:08] <mrm> gds: потрясающе
[12:52:19] <f[x]> вообщем камло работает, если поставить баш. для ocamlopt естественно нужен ещё mingw-gcc и flexlink
[12:52:50] <mrm> нужно прочитать вместо advanced topics in types and programming languages
[12:54:01] <gds> f[x]: грамотно.  Интересно, каким образом достигается.
[12:54:21] <gds> mrm: да, абсолютно согласен.  Жаль, что первый тираж разошёлся уже, не закажешь.
[12:55:34] Typhon вспоминает контекст типизации Г
[12:55:53] <gds> ну теперь-то с ним всё понятно!
[12:57:02] <f[x]> gds: http://camlunity.ru/ocaml-3.12-mingw-howto.txt
[12:57:20] <f[x]> всё из коробки
[12:59:01] <gds> может они реально пофиксили это, но раньше такая процiдурка не работала.
[13:00:17] <f[x]> наверное
[13:00:35] bobry- вошёл(а) в комнату
[13:00:51] <f[x]> так я думаю залить билд на camlunity и пропиарить в list'е?
[13:01:01] <gds> идея хорошая.
[13:02:42] <f[x]> правда чтобы его завести для native-code ещё надо кучу всего насетапать - flexlink, shell environment, gcc, ocamlfind
[13:02:57] <gds> ну это-то несложно.
[13:03:15] <f[x]> можно будет упомянуть overbld как сразу готовую среду со всем этим в комплекте
[13:03:18] <gds> удивительно, что вообще проканало всё это.
[13:03:36] <f[x]> ну, я помню что раньше постоянно косяки вылазили
[13:03:57] <bobry-> кошерно у х-ля все таки дока выглядит http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html <http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:fix> -- synopsis, contents
[13:04:00] <gds> кстати -- клёвый вариант про оверблд!  Тем более, есть чоткий сайт на сорсфорже и чоткий хттп-хостинг без гемора с торрентами.
[13:06:48] Kakadu вошёл(а) в комнату
[13:07:35] <Typhon> а правильно я понимаю, что тогда и сам оверблд, в части инстала самого окамля упростится?
[13:07:42] <Typhon> типа, патчи уйдут какие-нибудь
[13:08:44] <gds> да, так.
[13:13:03] <Typhon> bobry: ну, коммьюнити сайт с доками для питонов и рубей есть, можно сделать и для окамеля, заодно пропатчив ocamldoc, например, чтобы он делал всё как нравится :-)
[13:14:05] <f[x]> хз, по-моему там все патчи остаются
[13:14:22] <f[x]> ocamldoc_makefile_nt нужно в апстрим пихнуть
[13:18:13] <bobry-> Typhon: да там патчить ничего особо не надо -- пихай себе свой css и js :)
[13:26:34] <gds> если этого никто не сделал -- значит почему-то сложно либо не нужно, либо оба пункта.
[13:32:30] <bobry-> lwt сделали частично
[13:36:20] <gds> f[x]: даже патч с c:\\tcl\\lib\\tcl85.dll тоже остаётся?  вроде у тебя без этого изврата обошлось.
[13:36:58] <f[x]> вот это как раз единственное ручное вмешательство
[13:37:28] <f[x]> в otherlibs/lablkt/support/Makefile TK_LINK передаётся через -ldopt и корежится
[13:37:34] <f[x]> в других местах используется ок
[13:37:42] <f[x]> поэтому я там его просто закомментил
[13:37:59] <gds> но как оно работает с закомментированным?
[13:38:02] <f[x]> надо ещё покопать, похоже какая-то бнопня в ocamlmklib
[13:38:11] <f[x]> не знаю как работает, но собирается ;)
[13:38:29] shaggie вошёл(а) в комнату
[13:38:38] <gds> типизируется -- значит работает!!111122
[13:45:47] ermine уныло потыкала в ocaml-text
[13:46:14] <ermine> скажите, как можно быстро впечатать в строку число в поле заданной длины, дополнив слева нулями?
[13:46:59] <ermine> типа "%04d"
[13:47:35] <gds> ermine: 1. создать строку с числом, 2. создать строку с нулями, 3. blit из первой во вторую.  Это самое быстрое что приходит на ум.
[13:48:32] <ermine> а да. blit
[13:49:18] <ermine> можно еще контакентить с String.make n '0'
[13:49:59] <ermine> а вообще повсюту аллокации, если в цикле страдать
[13:50:14] <gds> это -- проще, но лишнее выделение памяти.
[13:50:16] <ermine> повсюду
[13:51:26] <ermine> да blit проще если операция разовая и заранее известра длина строки полной
[13:51:37] <ermine> только арифметики много
[13:52:07] <gds> о да.  Но тебе надо было СКОРАСТЬ, если "быстро впечатать".
[13:52:59] <ermine> хе
[13:53:15] <ermine> как только дело доходит до циклов...
[13:54:26] <gds> я бы вообще тупо сделал:
let lpad0 len str = String.make '0' (max 0 (len - String.length str)) str
и только потом смотрел бы, нужно ли бодаться с арифметикой.
[13:54:49] <ermine> а, полная длина известна
[13:55:18] ermine выкидывает свою могучую библиотеку перекодировк везде в пользу ocaml-text
[14:15:25] <gds> никто, случаем, не хочет сделать полезное дело, позволящее ускорить камлокод, особенно высокоуровневый?  Есть идейки.  Можно было бы распарсить какое-то из низкоуровневых представлений (наверное -dlambda или -drawlambda, но может и -dparsetree), оптимизировать его и всосать взад.  Оптимизации -- известно какие: значения, помеченные определённым образом, постараться пропихнуть максимально глубоко по графу вызовов, в конце избавившись от них в рантайме полностью (но, вероятно, порождая лишний код -- у всякой оптимизации есть и цена фейла, и область применимости).
[14:30:42] <f[x]> все хотят, а кто сможет?
[14:30:46] <f[x]> имхо это не так-то просто
[14:36:19] <gds> 1. изучить, какой формат точно экспортить-импортить -- он должен быть "чистыми данными",
2. написать рядом с экспортилкой импортилку этого формата,
3. помечать значения какой-нибудь функцией, остающейся в этом представлении -- по идее, любая функция с неизвестным телом (например, external : 'a -> 'a = "%specialize_by_this_value"),
4. использовать ту же импортилку/экспортилку в написании своего кода,
5. добавить "хуки", прогоняющие -dlambda (или какой нужно формат) через внешнюю софтину,
6. во внешней софтине смотреть на "датафлоу" значений, помеченных спец.функцией, пытаться разворачивать код, генеря рядом функции с таким же телом, но с подставленными значениями, и заниматься несложным constant folding,
7. как бонус -- если пометить функциональное значение, оно должно заинлайниться в передаваемую функцию.
[14:36:31] <gds> ах да,
8. PROFIT
[14:38:35] <gds> -dparsetree вроде не пойдёт как формат, так как там, как я помню, ленивые значения используются (окружение, что ли, хранят так), а ленивые структуры данных -- это не структуры данных вообще, формально.  это каша из данных и кода.
[14:43:19] <gds> кстати, тут кто-то рассказывал, что фрищчь сделал какое-то -ppx штоле.  Есть ссылота под рукой?
[14:44:14] <ermine> yне сделал еще
[14:44:30] <ermine> это у него пропозал был
[14:44:54] <ermine> щас найду ссылоту
[14:45:59] <ermine> http://lexifi.com/blog/syntax-extensions-without-camlp4
[14:46:58] ermine проверила блог фриша и обнаружила, что забыла почитать про иплицит агрументы
[14:56:20] <f[x]> вопрос в том будет ли в этом представлении достаточно инфы чтобы делать такие оптимизации
[14:56:28] <f[x]> т.е. и значения и типы нужны
[14:57:15] <f[x]> кстати ocamlpro вроде запилили флажок pure/не-pure функция и используют для потимизаций
[15:15:45] komar вышел(а) из комнаты: Replaced by new connection
[15:15:45] komar вошёл(а) в комнату
[15:40:15] digimmortal вошёл(а) в комнату
[16:41:35] komar вышел(а) из комнаты: Replaced by new connection
[16:41:36] komar вошёл(а) в комнату
[16:46:50] komar вышел(а) из комнаты: Replaced by new connection
[16:46:51] komar вошёл(а) в комнату
[16:55:13] <f[x]> ВНЕЗАПНО: релизнули mldonkey 3.1.0 с DHT и partial download
[16:58:56] <ermine> не прошло и года?
[16:59:17] <f[x]> угу
[17:26:09] Kakadu вышел(а) из комнаты
[17:26:12] shaggie вышел(а) из комнаты
[17:34:12] <ermine> неужто в ocaml-text БАГА-БАГА..
[18:31:56] Kakadu вошёл(а) в комнату
[18:43:05] shaggie вошёл(а) в комнату
[19:04:10] Typhon вышел(а) из комнаты
[19:24:28] ermine в который раз убеждается, что рефакторить свой код n-летней древности - гиблое занятие
[19:24:53] <bobry-> вай?
[19:26:38] <ermine> сколько глюков найдешь, сколько наплодишь сам
[19:26:54] <ermine> а еще надо вспомнить, нахрена вон та конструкция тут
[19:27:26] <gds> если код не самодокументирующийся, комментарии нужны.  В противном случае -- нет.
[19:29:37] <bobry-> реквестирую пример самодокументирующегося кода
[19:31:55] <ermine> кстати, в том коде у меня забавный стиль обработки строк - начинать с хвоста, и писать loop = function 0 -> конец вместо проверки на длину строки
[19:36:20] <gds> bobry-: value print_int = string_of_int %> print_string;
[19:37:35] <gds> bobry-: value create_someshit_container = Hashtbl.create 17;
[19:37:56] <bobry-> ну это совсем короткий кусок, поэтому он очевиден :)
[19:38:00] <bobry-> кстати, что за %>
[19:38:54] <gds> bobry-:
(в предположении, что выше написано "module B = Json_type.Build") :
value error_handler e : I.iteratee _ Amall_http.response =
  let rec msg e =
    match e with
    [ Failure txt -> txt
    | Parvel.ECall (`Exn_string txt) -> txt
    | e -> Printexc.to_string e
    ]
  in
  let j = B.array [(B.string "error"); (B.string & msg e)] in
  respond_txt (Printf.sprintf "%s\r\n"
    (Json_io.string_of_json ~compact:True j))
;
[19:39:26] <gds> %> -- это два в одном.  1. композиция, протаскивающая аргумент слева направо, 2. клёвый смайлик.
[19:39:47] <bobry-> а я у typhon'a утянул тоже самое в виде |>
[19:39:55] <gds> лол точно?
[19:40:17] <bobry-> ага, в батарейках по моему тоже что-то подобное
[19:40:33] <gds> вроде |> определяют как "пропускание аргумента, который слева, в функцию, которая справа", не?
[19:40:33] <bobry-> код выше не требует комментариев agreed
[19:41:10] <bobry-> стоп, неправильно понял описание
[19:41:29] <bobry-> можно код %>?
[19:41:32] <gds> пропустить аргумент != создать композицию, ага
[19:41:40] <gds> value ( %> ) f g = fun x -> g (f x);
[19:42:32] <bobry-> https://github.com/little-arhat/cobson/blob/master/src/util.ml#L8 ан нет, вот оно :)
[19:43:57] <gds> ага, это всё оно :)
[19:44:43] <gds> я вот этот "%" увидел у жиованни, оттуда спёр и изредка пользую.  Думаю, что в связи с "%>" надо бы сам "%" переименовать в "%<", чтобы направление было видно.
[19:45:19] <bobry-> да, так пожалуй нагляднее
[19:45:45] <bobry-> оставлю ка я вопрос typhon'у, вдруг он еще появится -- https://github.com/little-arhat/cobson/blob/master/src/util.ml#L92 в чем вкусность такого буфера?
[19:46:39] <bobry-> ах, это просто такой хак
[19:47:11] zinid вышел(а) из комнаты
[19:48:35] <bobry-> надо было написать не ocaml batteries, а ocaml stdlib :)
[19:48:37] <gds> хак разной степени надёжности.  Работает -- хорошо/радостно.  Поменяют тип -- прекратит работать.
Вообще, Buffer надо было изначально так определять, в stdlib.  Может, разве что, само определение закатать в Buffer.Dont_use_implementation_details
[19:48:57] <gds> (в модуль с таким названием, имею ввиду)
[19:49:27] <gds> потому что всё равно можно сделать такой хак и следить за имплементацией руками, а можно было бы сделать модуль и заставить компилятор следить за имплементацией.
[19:49:49] <bobry-> а как можно скрыть опеределение?
[19:49:59] <bobry-> в смысле что стоит за "заставить компилятор следить за имплементацией"
[19:51:45] <gds> в структуре -- type t = { str : string ; ofs : int }, в сигнатуре -- type t и всё.
имплементацию можно было бы засунуть в Buffer.Impl, экспортировать её честно, а Buffer.t оставить абстрактным.  Сходу не уверен, получится ли, но _подобные_ фокусы получаются, может по-другому.
Так вот, заставить -- это использовать Buffer.Impl.t и его детали имплементации, и при изменении получить просто некомпилируемый код, а не рантайм фейлы.
[19:52:32] <gds> вообще, итераты (и уже несколько примеров после них; сходу не вспомню) заставили слегка переосмыслить абстракцию типов.  Это не панацея лол.
[19:57:17] <bobry-> а где нибудь в stdlib подобный финт имеется?
[19:57:27] <bobry-> навскидку пробежался по паре модулей -- все открыто :)
[19:59:43] bobry- вышел(а) из комнаты
[20:03:08] <gds> какой финт?  открытые типы?  в String, в List :)  закрытые?  в Queue, в Stream.
[20:07:49] <ermine> gds: а ты уже используешь конструкции вида let f (type t) (x:t) = ..?
[20:19:53] digimmortal вышел(а) из комнаты
[20:41:22] <gds> ermine: type -- пока не приходилось, нужды не было.  хотя думаю вот.  да и вообще, я себе разрешил 3.12 очень недавно.
опять же, use cases неочевидны -- отладка типов и чуть более явная типизация, разве?
[20:52:53] <gds> и вообще, меня вчера/позавчера жутко бесило, хотелось взять и прочитать парсер camlp4r.ml или как он там.  Причина -- не мог в revised syntax в сигнатуре модуля объявить labelled аргумент с типом в объявлении конструктора класса.  Казалось бы, все так делают, ан нет.
[20:53:09] <gds> , поэтому в синтаксические чудеса лезть страшно.
[20:54:56] <gds> тьфуты, я же это даже запушил, чего это я голословно так.  https://bitbucket.org/gds/cadastr/src/80ac3f19985d/cadastr.ml#cl-347 -- там sig .. end закомментировано.
[21:00:08] mrm вышел(а) из комнаты
[21:07:15] <bobry> gds: ты так размашисто пишешь :)
[21:07:51] shaggie вышел(а) из комнаты
[21:14:30] <gds> ога, факт.  После того, как прочитал камлофак какой-то, где "вы читаете код чаще всего (чаще, чем исправления, а они чаще собственно написания кода), поэтому никогда не срите на читаемость", я перечитал более девяти тысячи тонн плохого кода, и при чтении замечал, что именно больше всего не нравится в плане читаемости (а то и в других планах).  И вот, пробовал всяко.
[21:15:03] <bobry> мне так с непривычки такой тоже сложно читать
[21:16:11] <bobry> но вообще мысль здравая, я ее в effective ml слышал
[21:18:16] <gds> если часто читать кодэ, явно хочется упростить его чтение до уровня идиота.  На средних/умных я не рассчитывал.  Мне важно, чтобы идиот в моём лице, смотрящий на код через год, смог прочитать его и не бить прошлого меня бошкой об стену, потому что бошка у нас одна на двоих.
[21:19:52] <bobry> дай угадаю -- у тебя большой монитор? :)
[21:20:08] <bobry> у меня просто 14'', посему много кода на экран не помещается, от силы строчек 50
[21:20:18] <bobry> и такое использование \n выглядит просто расточительным
[21:22:57] <gds> посмотрел.  24 строки в режиме "код + компиляция" и 35 строк в "чисто код".  Потому что есть и другие окна.  Ну и вообще, "одна функция на экран" -- разве криво?
[21:23:19] <gds> ах да, 19'' ЭЛТ, 1280x1024.
[21:23:27] <bobry> да не, функции то как раз убираются
[21:23:38] <bobry> а вот модули когда : и = на отдельной строчке уже нет :)
[21:27:00] <gds> ну синтаксические формы по своей структуре такие, что
module Xxx : SIG = STRU;
и вот, эти SIG/STRU разносит, что получается
module Xxx
:
  SIG
=
  STRU
;
вроде как ок.  Видно, где что.
Ещё одно дело -- я периодически ударяюсь в лишний "факторинг".  Лишнее структурирование, лишняя функциональность.  Поэтому проще научить себя жить с тем, когда вложенность достигает 8 уровней, нежели всё выносить в функции/модули/классы, часто ошибаясь.
[21:29:43] <gds> понятно, мои советы лишены смысла для тех, кто пишет факториалы, проекты эйлера и числа ффиббонначчи.  Там-то да, 5 строк на функцию, не больше.
[21:33:57] <bobry> тут такие есть? :)
[21:34:28] <bobry> кстати, нескоромный вопрос -- чего ты на камле пишешь? в смысле какие задачи?
[21:34:39] <gds> бывают.  Ну да это не стыдно, а вот гордиться таким -- стыдно.
[21:35:08] <bobry> ну проект эйлера дело хорошее, правда там читаемость необязательна
[21:37:35] <gds> задачи -- очень разные.  разве что не было: реалтайм-ада, адской графики, адской звукообработки, слищком мощных дсл, адового xml, серьёзной параллельности (вон, пишу кое-что, но пока не слишком серьёзно), серьёзных веб-проектов (тоже пишу кое-что, тоже несерьёзное, и вообще, ровняйсь на ocsigen), а многое другое скорее таки было.
[21:38:39] <bobry> у вас там камль -- единственный язык?
[21:38:41] <bobry> ну не считая си
[21:42:33] <gds> "у нас" -- это много где.  есть основная работа (с позавчера -- ровно одна, раньше было две), есть разные подработка.  а на основной -- кстати, похапэ продаётся больше всего пока что.  вот куда надо идти!  :]
[21:43:07] <bobry> как то ты круто, на двух работах + подработки, видимо приходит с опытом :)
[21:43:29] <bobry> а как контора называется, которая теперь одна? если не секрет разумеется
[21:43:34] <gds> ненененене!
[21:43:38] <gds> такое не надо.
[21:43:38] <bobry> ну вот
[21:43:55] <bobry> хотя в общем то и не важно это :)
[21:45:33] <gds> такое не надо, потому что фуллтайм плюс серьёзная работа (особенно которая поинтереснее фуллтайма) в сумме дают ональный ад.  А подработки -- мелкие, типа-хобби, только с результатами, да и не часто.
[21:47:45] <gds> контора, которая одна -- тут упомянута: https://bitbucket.org/gds/amall/src/beb703dff51a/README.txt#cl-9
[21:53:23] ygrek вошёл(а) в комнату
[21:53:36] ygrek вышел(а) из комнаты
[21:53:54] ygrek вошёл(а) в комнату
[21:54:07] ygrek вышел(а) из комнаты
[21:54:40] ygrek вошёл(а) в комнату
[21:54:54] ygrek вышел(а) из комнаты
[21:55:10] ygrek вошёл(а) в комнату
[22:19:11] <bobry> товарищи, чета я не могу определиться как лучше -- Binary.unpack_unsigned_8 byte_order:`Little_endian или на манер lwt Binary.LE.unpack...
[22:19:40] <bobry> вроде и хочется и колется сделать с LE, но с ~byte_order по читаемей буит
[22:20:33] shaggie вошёл(а) в комнату
[22:47:42] Kakadu вышел(а) из комнаты
[22:59:21] <gds> типы решать должны.  Они разве одинаковые?  Чем хороши модули, что там значения (в том числе функциональные) могут иметь разные типы, чего с именованным аргументом-параметром нельзя оформить.
[23:00:02] <bobry> типа одинаковые буду, речь о том чтобы зафиксировать в модуле ~byte_order
[23:00:10] <bobry> ибо редко когда приходится смешивать be и le
[23:01:11] <gds> точно?  ну вот и зафиксировать, чо чо.
[23:08:51] <bobry> еще один глупый вопрос -- принято ли в камле делать exceptionы на каждый чих, в Core вот у них почти на каждую функцию свой, хотя к большинству случаев явно подойдет что то вроде Invalid_argument
[23:09:38] <gds> raise Exit!!1111111
[23:10:22] <bobry> ну, в питоне часто обходятся built-in :)
[23:10:26] <bobry> поэтому я слегка в смятении
[23:10:44] <gds> интересно, что там "встроено-в"?
[23:11:07] <bobry> в смысле какие exceptionы или тебя само слово смутило?
[23:12:31] <gds> Invalid_argument -- такое же исключение, как и остальные.  Поэтому, я, не поняв вопроса, решил уточнить его.  В чём собственно вопрос/проблема.
[23:12:56] <bobry> вопрос про правила хорошего тона
[23:13:07] <bobry> минимум exceptionов на все случаи жизни
[23:13:15] <bobry> или Invalid_argument_of_function_foo
[23:13:20] <bobry> на каждый чих
[23:13:37] <gds> вопрос понял
[23:13:39] <gds> ответ выдам
[23:14:36] <bobry> лол
[23:20:34] <gds> исключения -- они на то именованные, чтобы их ловить.  Когда стоит ловить исключения?  Когда фатальная ошибка алгоритма -- Assert_failure -- точно не стоит, зачем.  Разве что в рамках ловли всех ошибок, чтобы лвт-тред не упал.  Когда ошибка "кривой аргумент суёшь в наше гламурное апи" ака Invalid_argument -- наверное тоже не надо ловить в целом, так как другой аргумент не засунешь же? -- а если засунешь, то почему не засунул изначально, лох штоле?  Когда ошибка "какой-то облом тут, но хз кто накосячил -- а не ты ли, бератищке, ааа?" -- это Failure.  Когда известно, что на такое-то исключение следует реагировать конкретно таким-то образом -- значит надо его ловить и так реагировать.  Ну и вообще, если "защищённый тред, не дОлжный вылетать" -- ловим всё, не падаем, держимся из последних.  Если "хоть какая-нибудь лажа -- и всё, пипец" -- ловим лажу, сообщаем юзеру, выходим.  Можно комбинировать.
[23:23:44] <bobry> хммм, ну в общем то makes sense -- проясняет картинку, независимо от камла :)
[23:23:51] <bobry> мерси
[23:40:11] ermine вышел(а) из комнаты
[23:44:34] <gds> кстати вот, про камло.  У меня было много способов "доложить об ошибке".  И каждый, сцуко, со своими недостатками.  И недостаток каждого из способов в том, что он несовместим с другими способами.  Были: raise/try-with, option, res=[`Ok|`Error], IO-манатка, Iteratees-манатка.
Вывел такое: для внешних средств -- оборачивать вызовы в то, что нужно текущему коду; для чистых вычислений -- option канает; для остального -- тот способ, который предусмотрен контекстом, так как обычно таки либо манатка, либо try-with.  Для чистых и с сайд-эффектами -- try-with вполне ок, для монадных -- исключительно M.catch, где M -- манатка, и только так.  Вот последнее -- то, что долго пытался "отфакторить", но вышло буквально пару месяцев назад.
[23:45:22] <gds> ( .. для чистых вычислений с необходимостью доложить ошибку -- res)
[23:47:27] <bobry> а почему для монадных только catch?
[23:47:28] gds вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!