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

GMT+4
[00:04:35] shaggie вышел(а) из комнаты
[00:23:57] Kakadu вышел(а) из комнаты
[01:43:10] Typhon вошёл(а) в комнату
[02:00:28] ygrek вышел(а) из комнаты
[02:09:14] Typhon вышел(а) из комнаты: Replaced by new connection
[02:09:16] Typhon вошёл(а) в комнату
[03:34:56] Typhon вышел(а) из комнаты
[03:45:49] bobry вошёл(а) в комнату
[03:45:49] bobry вышел(а) из комнаты
[04:07:26] klapaucius вышел(а) из комнаты
[05:50:19] letrec вошёл(а) в комнату
[05:51:28] letrec вышел(а) из комнаты
[10:13:20] <bobry> вот jane street дают, пост про новую библиотеку и ни строчки кода
[10:17:45] bobry вышел(а) из комнаты
[10:46:41] ygrek вошёл(а) в комнату
[11:01:19] <komar> Опять какую-то фигню выпустили.
[11:06:33] <f[x]> ты не шаришь
[11:10:05] bobry вошёл(а) в комнату
[11:22:12] bobry вышел(а) из комнаты
[11:24:59] bobry вошёл(а) в комнату
[11:38:23] Kakadu вошёл(а) в комнату
[11:39:09] <Kakadu> bobry: почему ни строчка. таболл же выложили
[11:43:49] <bobry> тарбол то д а — я про примеры в статье
[11:45:07] <Kakadu> ты многого хочешь
[11:45:23] <Kakadu> главное что они выложили. мужик сказал --- мужик сделал.
[11:49:47] ygrek вышел(а) из комнаты
[12:12:43] ermine вошёл(а) в комнату
[12:35:52] <bobry> # ref (module Foo : M);;
- : (module M) ref = {contents = <module>}
[12:35:54] <bobry> nice :)
[12:42:03] <bobry> а вот функцию из такого модуля легко не выдернуть
[12:45:21] shaggie вошёл(а) в комнату
[12:45:26] <gds> ога, появилась третья функциональность, дублирующая две уже дублирующиеся -- записи и объекты.
ну это я образно, но отличия есть.
кстати, вполне так несложно спроектировать единственное определение типа, которое включит в себя все возможности.  А именно: 1. фичу модулей -- existential types -- добавить в определение явные "exists type t" или типа того, 2. адресацию по смещению и по непересекающемуся имени описывать, допустим, как field myfield : int, а адресацию по хешу метода, допустим, как method mymethod : int.  Но этого уже не сделать.
[12:46:10] <gds> а выдёргивать функцию -- это отдельная история.  Не всегда получится.
[12:46:38] <bobry> получается конечно, но уродливо let module Foo = (val !<ref> : M) in ...
[12:54:08] <bobry> gds: спасибо за наводку на классы, я что то наворотил этих первоклассных модулей, а оказалось что классы как раз то что нужно :)
[12:57:57] <gds> да, так тоже бывает :)
[12:58:18] <gds> кстати, видел мой вчерашний псот?  там у меня tnum#eq, tnum#show всякие.
[12:59:43] <bobry> nope, можешь продублировать ссылочку, если не сложно?
[13:00:17] <gds> http://gdsfh.dreamwidth.org/13876.html
[13:17:30] <gds> а чего дают новичкам почитать про continuation-passing style?
[13:26:17] <bobry> gds: а что за магия с t#show? что то я не могу понять
[13:28:54] <gds> никакой магии (в камлотерминах).  каждому нужному типу 'a (например, Num.num) сопоставлено значение с типом t 'a (например, t Num.num), содержащее явные функции для операций cmp eq hash show (причём иногда опциональные, иногда обязательные, с возможностью проконтролировать это статически -- например, в Map.Make передаётся только тот модуль, где cmp обязательное, а в функцию show передаётся любой объект, в котором, на худой конец, method show _ = "<abstract>").
[13:37:57] Typhon вошёл(а) в комнату
[13:38:36] <bobry> красиво, почти шо type classes
[13:39:25] <gds> да, тут наблюдается некое сходство :]]
[13:40:01] <bobry> кстате странно что на камле не написали свою dvsc
[13:40:05] <bobry> *vcs
[13:40:24] <bobry> даже у х-ля, прости господи, есть своя
[13:40:52] <gds> кстати вот, про t#eq и прочее -- это идеологически не ок, не гибко.  правильно будет eq t y zero и show t & lcm a b.
[13:41:23] <bobry> а чем метод то плох?
[13:41:25] <gds> dvcs -- есть мнение, что я её буду писать на камле, но, вероятно, она будет долгое время закрыта в плане исходников.
[13:41:33] <Typhon> но зачем?
[13:41:39] <bobry> вопрос
[13:41:46] <Typhon> в смысле, чего нет в git/hg/fossil/darcs ?
[13:41:51] <bobry> gds: у вас реально есть потребность?
[13:43:09] <gds> вызов метода плох тем, что для некоторых схем нужно будет обрабатывать обязательность-желательность значений.  например, eq t a b может в случае, когда eq == No.eq (значение по умолчанию), но cmp != No.cmp, использовать eq t a b == (EQ = cmp t a b).  Ещё подобные примеры были для show/dump.
[13:45:07] <gds> потребность есть -- мульёны легковесных изменений, подчинённых полуавтоматической логике слияний, где результат слияния будет выдаваться в качестве "рабочего пространства" пользователю (в гуй).  многое вообще не надо будет хранить на диске, многое надо очень чётко и уверенно хранить (настолько, что никаких своих форматов данных, а только postgresql и его wal).
[13:46:41] <Typhon> gds: конфигурация ?
[13:46:53] <Typhon> в смысле, хранится конфигурация чего-нибудь там будет?
[13:46:57] <gds> и забыл уточнить -- там не совсем на файлах работа, скорее на хитрых графах с некоторыми дополнительными свойствами.
[13:47:43] <Typhon> *храниться
[13:48:00] <gds> не столько конфигурация, сколько схема / граф / тексты / малоструктурированная инфа / связи / категории.
[13:50:39] <gds> например, если есть две операции "set node1 property1 newvalue1" и "set node1 property2 newvalue2", их можно смело слить.  Вот множество реальных операций от пользователя будут такими, которые можно сливать смело.  Я прикидывал, как это было бы кодить поверх какого-нибудь гита (даже с libчототам, дающей доступ напрямую), и стало как-то нехорошо :)
[13:51:35] <gds> а если учесть, что случаев падения гита (недоступность / потеря данных) больше нашлось, чем случаев падения постгреса с его wal, для персистентности выбрали именно постгрес.
[13:55:28] <gds> кстати, забавный факт нашёлся: в случае общего корня и N веток dvcs существует топологическая поверхность (в дискретной топологии, конечно) размерности N-1, ограничивающее все варианты бесконфликтных слияний.
[13:56:23] f[x] вышел(а) из комнаты: brain exhausted
[13:56:35] gds lol
[14:40:38] f[x] вошёл(а) в комнату
[14:54:15] <Kakadu> bobry: в мэйл-листе появились примеры кода
[15:02:08] ygrek вошёл(а) в комнату
[15:06:02] <gds> ещё из недавнего, про t#show: научил List.dump использовать метод show, и имею http://paste.in.ua/3242/
[15:17:07] <Kakadu> А List.dump где-нить в репке есть?
[15:17:15] <Kakadu> gds: ::
[15:17:23] <Kakadu> gds: ^^
[15:17:37] <gds> ща будет.
[15:18:37] <gds> Kakadu: https://bitbucket.org/gds/cadastr/src/tip/src/cd_List.ml#cl-467
[15:22:04] <gds> вот, кстати, вспомнилась ещё одна причина использовать show t v вместо t#show v -- когда-нибудь мне явно захочется избежать выделения строки только с единственной целью доклеить её в буфер.  И в другой метод, типа show_to_substrings, будет передаваться подстрока, куда метод сможет нагадить.  А show t v будет уже использовать show_to_substring у себя, так, чтобы не тащить метод show, который уже будет не нужен, в методах объекта.
[15:22:49] <Kakadu> мдя. gds наворочтил что-то дикое
[15:23:39] <gds> да вроде в List.dump всё тупо.
[15:24:09] <Kakadu> я не могу осмыслить что такое  #Cdt.t _
[15:24:36] <Kakadu> а, нашел
[15:24:50] <gds> дикое только вот-вот принялся воротить -- то, что позволит несложным образом сгенерить tmytype : t 'a -> t (mytype 'a)
[15:25:23] <gds> #Cdt.t _ -- тип "всё, что совместимо с Cdt.t, имеющим любой один типовый параметр".
[15:26:35] <gds> а то же, если ему укажешь просто Cdt.t _, оно скажет "а вот тут у вас больше методов, чем мне надо -- я так не играю!".
[15:26:55] <Kakadu> мне непонятно как tmytype_bool может быть совместимым с каким-то классом
[15:27:15] letrec вошёл(а) в комнату
[15:27:57] bobry вышел(а) из комнаты
[15:27:57] <gds> эх.  придётся показывать не только красивое, но и уродливое.  http://paste.in.ua/3243/
[15:29:16] <Kakadu> ааа
[15:29:17] <gds> Typeinfo.t ?show () делает описание типа, имеющее тип t 'a.  Конечно, есть и более богатые типы, например, которые делает Typeinfo.tfull ~cmp ?eq ~hash ?show ()  (show необязателен всегда, а eq можно вывести из cmp, если не передали).
[15:29:57] <Kakadu> > type mytype 'a = [ Int of int | String of string | Unit | Val of 'a ];
> value tmytype_bool = tmytype tbool;
где становится объявлен tmytype?
[15:30:30] <gds> кстати, вот таким коммитом я добавил Bool и tbool: https://bitbucket.org/gds/cadastr/changeset/60b896cd016c
[15:31:23] <gds> очевидно, после mytype, но до tmytype_bool
[15:31:51] <Kakadu> ты неатравливаешь какое-то синтаксическое расширение, что его создает7
[15:31:53] <Kakadu> ?
[15:32:01] <Kakadu> натравливаешь*
[15:32:07] <gds> но и уродливое: http://paste.in.ua/3243/
[15:33:08] <gds> сейчас хочу сделать хрень, которая позволит облегчить написание подобного кода.  но сложно это.
[15:33:34] <gds> сейчас -- тупо, никакой магии.
[15:36:18] <gds> синтаксические расширения -- говно.  они вместе не работают, они с revised syntax не работают.  в топку.  только для редких случаев.  всё должно быть решаемо на уровне библиотек.
[15:40:12] <gds> а облегчать http://paste.in.ua/3243/ надо, потому что: 1. тестовый пример небольшой, реальные типы большие, 2. в тестовом примере я изложил только show, а есть ещё cmp, hash, может что ещё будет.
[15:41:53] <gds> то есть, пройтись один раз по типу -- это нормально.  больше одного раза -- ненормально.  а как пройтись один раз, чтобы этот проход дал и show, и cmp, и hash?  потому то и спрашивал про continuations.  кстати, есть идейки?
[15:42:09] <gds> я не гордый, приму любую помощь :)
[15:44:35] <gds> (я знаю, многие сейчас подумали либо про стену, либо про яд.)
[15:51:50] ygrek вышел(а) из комнаты
[16:23:22] bobry вошёл(а) в комнату
[16:23:46] <bobry> товарищи, а что надо поменять в окружении чтобы грузить stublibs для пакетов установленных через odb
[16:24:26] <bobry> echo $HOME/.odb/lib/stublibs | sudo tee -a `ocamlc -where`/ld.conf — RTFM :)
[16:24:46] <f[x]> yes!
[16:29:07] komar вышел(а) из комнаты: Replaced by new connection
[16:29:07] komar вошёл(а) в комнату
[16:35:45] komar вышел(а) из комнаты: Replaced by new connection
[16:35:45] komar вошёл(а) в комнату
[17:13:15] bobry вышел(а) из комнаты
[17:26:31] bobry вошёл(а) в комнату
[17:27:04] <bobry> и почему в stdlib камло вообще нет объектов — вроде бы насколько удобней писать tbl#mem <foo> чем Hashtbl.mem tbl <foo>
[17:28:00] <gds> потому что вело бы к непроизводительному коду и к гемору с типизацией (она у объектов/классов сильно сложнее, чем у модулей).
[17:29:19] <Typhon> bobry: сомнительно, насчёт удобства ;-)
[17:29:20] <gds> если хочешь -- бери кадастр и рисуй cd_Hashtbl.ml с нужными функциями.  Я не против, я за.  Заодно нарисуй его так, чтобы оно вписалось в интерфейс Cadastr.Timp.map_rwm (imperative/mutable map, read-write, multiple/shadowing bindings).
[17:29:57] <gds> Typhon: где-то удобно, где-то нет.  Оба варианта не идеальны.
[17:58:58] ygrek вошёл(а) в комнату
[18:05:58] <bobry> кадастр это конечно замечатльно, и пример в последнем посте gds's выглядит очень секси, но  в odb его увы никак не включить :(
[18:06:46] <gds> недопонял.
[18:07:00] <Typhon> я не понял, зачем он тебе в одб?
[18:07:04] <Typhon> если ты его подевелопить хочешь
[18:08:04] <bobry> не-не, я просто ковыряю odb :)
[18:08:23] <bobry> мысль о неудобство модулей как раз по мотивам ковыряний
[18:08:43] <bobry> а черт, невнимательно прочитал — gds предложил дописать туда нужный модуль
[18:08:47] <bobry> звиняюсь
[18:10:38] <gds> кстати вот, при всём моём старании, я не смог побороть необходимость открытия _двух_ модулей -- open Cd_All; open Cdt;.  Как-то с неделю назад обсуждали тут, могу поискать обсуждение.  Впрочем, это не критично, я считаю.  Сишникам так вообще привычно -- stdio + stdlib, чо :]
[18:16:00] <gds> кстати, если будет cd_Hashtbl.ml, то его можно и в кадастре заюзать, и спереть в нужный проект -- у меня же там лицензия такое разрешает.
[18:17:40] <gds> хотя вот, как помню, cd_Module.ml реализуют модуль Module просто с дополнительными значениями, по возможности не ломая функциональность (кроме строк).  Поэтому спирать надо будет и cd_Hashtbl.ml, и кусок cadastr.ml, где собственно объедктный интерфейс предоставляю к ассоциативным спискам, Map, в будущем к Hashtbl.
[18:18:34] <gds> почему такое разграничение -- чтобы open Cd_All, которое введёт новые привязки в область видимости (Hashtbl -> Cd_All.Hashtbl = Cd_Hashtbl.Hashtbl) не ломало бОльшую часть кода.
[18:23:45] <f[x]> gds: по-моему во всех stdlib overlay'ях так же - e.g. core extlib
[18:24:00] <gds> extlib -- ага, точно.
[18:25:29] <gds> кстати, я придумал, как можно их композиционировать.  Конечно, надо будет кое-что поменять, билд-схема будет кривоватой, но подпакеты народить смогу при нужде.  Например, pkg_cadastr для stdlib+cadastr, и pkg_cadastr.extlib для stdlib+extlib+cadastr.
[18:27:56] <gds> собственно, зачем я это вообще продумывал: мне extlib всегда нравился.  Как обнаружу, что кое-что в stdlib или у меня кривее, чем в extlib -- сразу буду её использовать.
[18:45:10] <f[x]> http://www.slideshare.net/acunu/acunu-ocaml-experience-report-cufp
[18:50:05] <Typhon> http://dl.dropbox.com/u/7365614/cufp-110924103541-phpapp02.pdf  pdf оттуда
[18:58:49] bobry вышел(а) из комнаты
[19:06:34] ygrek вышел(а) из комнаты
[19:18:15] <f[x]> судя по всему у нас скоро будет +1 камлокодер
[19:18:35] <f[x]> точнее будем кастовать в камлокодера
[19:20:20] <gds> ок!
[19:20:22] <Typhon> крутые!
[19:20:27] <Typhon> а из кого?
[19:20:48] <Typhon> "возьмите кровь девственницы, лапы лягушки и с++ программиста…"
[19:21:02] <f[x]> сишник
[19:21:13] <f[x]> студент
[19:23:26] <gds> сранних лет в функциональщину -- это очень ок.
[19:24:44] Typhon вышел(а) из комнаты
[20:19:50] bobry вошёл(а) в комнату
[20:36:14] letrec вышел(а) из комнаты
[21:07:48] Typhon вошёл(а) в комнату
[21:11:41] Typhon вышел(а) из комнаты
[21:16:51] Typhon вошёл(а) в комнату
[21:22:43] Typhon вышел(а) из комнаты: Replaced by new connection
[21:22:44] Typhon вошёл(а) в комнату
[21:28:55] shaggie вышел(а) из комнаты
[21:42:22] ermine вышел(а) из комнаты
[21:54:55] komar вышел(а) из комнаты: Replaced by new connection
[21:54:56] komar вошёл(а) в комнату
[22:20:11] <gds> ну вот, как-то так и делаются existential types на first-class modules: http://paste.in.ua/3244/
[22:33:21] <Typhon> кто-то трогал janestreet'овский Async ?
[22:33:29] <Typhon> у них там тоже немонады, на самом деле? :-)
[22:34:18] <Typhon> http://ocaml.janestreet.com/?q=node/100
[22:39:38] <gds> лично я только в рассылке читал, пока не трогал.  учитывая core, даже не знаю, стоит ли.  впрочем, lwt не сахар, как бы.  буду думать для будущих проектов, разве что.
[23:28:54] АК вошёл(а) в комнату
[23:30:01] <bobry> грр, как же одб поцно написан то -- мешанина из модулей, функций, типов
[23:31:17] <bobry> Kakadu: а где там в рассылке пример? что то не вижу
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!