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

GMT+3
[00:01:36] arhibot вошёл(а) в комнату
[00:02:04] arhibot вышел(а) из комнаты
[00:10:26] Typhon вышел(а) из комнаты
[00:25:50] gds вышел(а) из комнаты
[00:40:16] superbobry вошёл(а) в комнату
[00:40:49] <superbobry> ох, активистов меньше чем я думал :)
[00:40:53] <superbobry> все хеллоу
[00:40:56] <superbobry> *всем
[00:46:05] <Kakadu> поздно зашел
[00:46:19] Kakadu вышел(а) из комнаты
[00:51:17] <superbobry> probly
[03:06:37] komar вышел(а) из комнаты: Replaced by new connection
[03:06:38] komar вошёл(а) в комнату
[03:37:44] superbobry вышел(а) из комнаты
[03:49:36] zert вышел(а) из комнаты
[09:09:57] gds вошёл(а) в комнату
[09:37:49] ygrek вошёл(а) в комнату
[09:38:03] ygrek вышел(а) из комнаты
[09:38:27] ygrek вошёл(а) в комнату
[10:10:43] ygrek вышел(а) из комнаты: Replaced by new connection
[10:10:45] ygrek вошёл(а) в комнату
[11:34:54] Kakadu вошёл(а) в комнату
[11:42:51] ygrek вышел(а) из комнаты
[11:43:10] ygrek вошёл(а) в комнату
[11:43:12] ygrek вышел(а) из комнаты
[11:54:05] ygrek вошёл(а) в комнату
[12:10:55] <ygrek> > sprintf "%A", оказывается, не кидает наверх исключения в ToString()
И кто тут жаловался на французов? Эти-то точно не упустят возможности кинуть exn отовсюду!
[12:15:16] <gds> вообще, подумалось, что должны быть две sprintf, как там и как тут.  Для логов -- как там, для работы -- как тут.
Однако, учитывая, что сейчас люди пишут assert (function_with_sideeffects ()), дисциплины не выйдет.
[12:28:05] <ygrek> для логов всё равно нужен препроцессор, а там делаешь try with и всё
[12:29:44] <ygrek> во-вторых мне всё таки кажется что скрывать exn'ы от toString да и вообще нетривиальный toString - это неправильно
[12:43:34] <gds> иногда бывает и разумный нетривиальный toString, однако, мне кажется toString не должен кидать исключения.  Логика -- как со строгим порядком вычисления: "если значение есть, то оно уже вычислено", в применении к toString -- "если значение есть, то очевидно, что его можно хоть как-нибудь да преобразовать в строку".
[12:55:28] komar вышел(а) из комнаты
[12:57:45] <ygrek> наверное нужно два разных %A, с исключениями и с подавлением оных
[12:58:36] <gds> а в фа-диезе %A такое же, как в окамле?
[12:58:55] <gds> (т.е. как %a?)
[12:59:33] <ygrek> не, оно дёргает toString которого в камле нет вообще
[13:02:28] <gds> понял.  Но можно же обернуть: сделать функцию, принимающую любое значение, дёргающую toString, ловящую исключения, и в конце концов возвращающую просто строку, toString к которой тривиален.  То есть, было бы sprintf "%A" (wrap some_value) вместо sprintf "%A" some_value.
[13:07:49] <gds> это я на случай, если хочется как-то показывать исключение.
ну а для окамла в %a тоже делается подобное, если надо.
[13:18:10] superbobry вошёл(а) в комнату
[13:18:18] superbobry вышел(а) из комнаты: offline
[13:24:06] <ygrek> ну вообще да, сахарок, можно ведь строки и руками склеивать :)
[13:32:54] <gds> сейчас ковыряю сишный код, с окамлом связанный, и такое чувство, что создаётся несколько структур (хранимых в .c), и в одном случае обращение идёт к одной структуре, в другом -- к другой (где другие данные и фейл).
Как должно быть правильно -- в .h должно быть объявлено extern int foo, а в .c должно быть описано int foo = 123, так?
[13:35:18] <ygrek> в .h просто int foo;
[13:36:04] <ygrek> хотя я не помню точно что такое extern :)
[13:44:27] Typhon вошёл(а) в комнату
[13:58:26] superbobry вошёл(а) в комнату
[13:58:47] <superbobry> подскажите, а окамловский репл не умеет чего нить вроде :t в ghci?
[13:59:15] <superbobry> например мне бы хотелось посмотреть на тип ;
[14:00:45] <Typhon> # (+);;
- : int -> int -> int = <fun>
# print_string;;
- : string -> unit = <fun>
[14:01:02] <superbobry> ну для плюса я тоже научился :)
[14:01:20] <superbobry> а для умножения например?
[14:01:30] <superbobry> хочется какого нибудь универсального способа
[14:04:21] <Typhon> ну он универсальный, <имя>;;  -> показывает тип, и собственно значение. операторы в скобках пишутся, с умножением достаточно пробел поставить ( пушо `(*` -- начало комментария ).
[14:05:12] <superbobry> хм, а как для ; узнать тип?
[14:05:24] <superbobry> пробел не помогает
[14:06:41] <Typhon> а это не функция
[14:07:12] <Typhon> кстати, некоторые товарищи сильно ратуют за revised syntax
[14:07:13] <Typhon> http://caml.inria.fr/pub/docs/manual-camlp4/manual007.html
[14:07:58] <superbobry> а я тут вычитал в туториале шо функция
[14:08:15] <superbobry> врут?
[14:08:21] <Typhon> или я ^_^
[14:12:39] Typhon вышел(а) из комнаты
[14:13:23] <gds> не, ";" это не функция на самом деле, а мануал объясняет так, чтобы понятно было.
[14:13:39] <superbobry> а, ну тогда ок
[14:13:43] <superbobry> а то я уж подумал шо как в io
[14:13:58] <superbobry> правда там ; -- объект
[14:14:47] Typhon вошёл(а) в комнату
[14:15:27] <gds> я тоже так хочу кое-где сделать, подход правильный, но в окамле он усложнил бы дело, как я предполагаю.
[14:32:38] <gds> кстати, на чём простом обычно тренируются при реализации message passing?  не факториал же?
[14:34:15] <Typhon> можно тут посмотреть http://rosettacode.org/wiki/Distributed_programming
[14:34:31] <Typhon> хотя я глянул -- тот не совсем то, что видимо, хочется
[14:35:31] <Typhon> ох, это вообще одно задание только -- не пойдёт :-(
[14:37:13] <gds> ага, факт, не то.
[14:38:28] <gds> кстати, то, что я вчера вечером взялся писать проект, это хорошо в плане инициативы (не потерял её), но плохо в плане результата (сегодня удивлялся, откуда у меня в голове были такие картинки).  В общем, от гугловского документа будут отличия.  Сообщу, как более-менее дорисую интерфейс.
[14:43:45] komar вошёл(а) в комнату
[14:51:38] <Typhon> parvel, кстати, со шведского, переводится как "ползунок", если верять гуглетранслейту
[15:01:39] <gds> ога, это неоднозначное явление.  Если детские ползунки имеются в виду, то скорее плохо.
[15:02:23] <gds> par_vel можно было бы.  Да вообще, над названием не думал.  Разве что убедился, что гугло не даёт ничего значительного на слово.
[15:02:32] <gds> если есть идеи -- буду рад переименовать.
[15:04:02] <Typhon> на английский как toddler, "ребёнок, начинающий ходить" -- так что даже ок, наверное
[15:04:45] <gds> мне по нраву.
[15:50:35] <Kakadu> поздравьте меня. я накомпилял ocsigen
[15:53:39] <gds> шайтан!  Может оно ещё и запускается?
[15:55:24] <Kakadu> ну всмысле оно запускается
[15:55:34] <Kakadu> не знаю правда на каком уровне
[15:55:47] <Kakadu> или то сраказм был
[15:55:49] <Kakadu> ?
[15:56:24] <superbobry> товарищи, вот с такой вот ошибкой куда копать http://dumpz.org/34430/
[15:56:39] <superbobry> я так понимаю однозначно сказать низя из за чего она
[15:58:01] <Kakadu> hell dll это)
[15:58:13] <Kakadu> попробуй make clean для начала
[15:58:22] <ygrek> во pastebin'ы пошли - текста три строчки, а страница 500К
[15:58:29] <superbobry> да это собсна первой строчкой и пишется
[15:58:32] <superbobry> при make
[15:58:51] <ygrek> локальный модуль camlp4_import есть?
[15:58:56] <superbobry> хм, а помогло же :)
[15:59:03] <ygrek> а, ну или так
[15:59:19] <superbobry> магия какая то, вроде только реп клонировал
[15:59:22] <superbobry> шо там чистить то
[15:59:28] <ygrek> может реп грязный
[15:59:37] <ygrek> в смысле левые файлы
[15:59:47] <gds> Kakadu: никакого сраказма.  Интересно было, работает ли.
[16:06:25] <Kakadu> gds: буду разбираться, насколько работает и что надо доустанавливать
[16:13:24] ygrek вышел(а) из комнаты
[16:13:27] ygrek вошёл(а) в комнату
[16:42:03] <gds> представим message passing.  В текущем "дизайне" у меня нет отдельной функции "получить сообщение", и всё, предполагается, будет просто реагировать на входящие сообщения.  Но для синхронных вызовов это не очень ок.
Представим процесс, принимающий сообщения с типом 'i и отправляющий сообщения с типом 'o.  Представим, что ему понадобилось синхронно вызвать процесс, берущий сообщения с типом 'i2 и дающий результат типа 'o2.  Если у процесса одна очередь сообщений, то результат с типом 'o2 должен будет пройти через неё, но в общем случае 'o2 <> 'i.  Да и как-то кривовато это -- делать так, чтобы в receive loop был специальный код, обрабатывающий результаты синхронного вызова.
Вообще, вопрос оказался сильно хитрее, чем предполагалось.
[16:44:23] <Typhon> а процесс обязательно 'i -> 'o ? почему не 'i -> unit ?
[16:45:40] <gds> не обязательно, и по факту i -> IO.m unit.  Думал вот, что большинство процессов отправляют сообщения только одного типа, ну и ограничить это дело типизацией.
[16:46:23] <Typhon> ещё может 'i a = 'command | a -- что-то типа. либо коммандное сообщение, либо данные.
[16:46:35] <Typhon> коммандные сообщения не только, видимо, для синхронизации понадобятся
[16:46:44] <Typhon> таймауты, оповещения
[16:47:09] <Typhon> но я не читал ещё parvel идеи, по
[16:47:12] <Typhon> этому хз.
[16:47:35] <gds> там и не надо читать пока, там либо уныло, либо неправильно, либо оба.
[16:48:05] <Typhon> т.е. вне зависимости от того, что пользователь хочет таскать (он наверняка тоже свои типы для своих протоколов захочет), процесс ещё умеет "системные" сообщения ловить
[16:49:06] <ygrek> видимо поэтому в эрланге динамическая типизация?
[16:49:21] <ygrek> а полиморфные варианты не рулят?
[16:49:22] <gds> про типизацию -- вообще думал, что можно извратиться, и сделать сообщения с типом exn.  Но это -- черезчур сурово.
type msg 'i = [= `Command of [= `Exit | ..] | `Timeout | `Msg of 'i ];
[16:49:41] <gds> хотя лучше полиморфные-честные, ща.
[16:51:33] <gds> type base_msg = [= `Command of .. | `Timeout ];
type your_msg = [ #base_msg | Qwe | Asd ];  (* или как-то так *)
но надо как-то указать, что функция-обработчик должна уметь [> base_msg] или типа того.  Не знаю, точно ли это делается успешно.
[17:06:31] <Typhon> в your_msg как-то отражается выходной тип процессов, синхронные вызовы которых будет совершать первый процесс?  (ну вот Qwe и Asd это сообщения протокола, который реализует первый процесс или там 'o2 тоже есть?
[17:17:20] <gds> в том-то и дело, что неразумно отражать -- откуда я знаю, какие результаты хочу получать.
Есть идейка, впрочем.  Синхронный вызов -- он монадный по определению, т.е. call : server 'i2 'o2 -> 'i2 -> IO.m 'o2.  Так вот, можно сделать так, чтобы call создавал какую-то около-переменную (mvar?) с типом 'o2, и делал так, чтобы при ожидании результата call'а (т.е. при ожидании значения с типом IO.m 'o2) на самом деле ожидалось заполнение этой переменной.  Ну и в случае кода "call serv arg >>= fun res -> ..." надо, чтобы с этой переменной была связана closure "fun res -> ...".  То есть, как только переменная заполняется, её результат идёт в res и вызывает дальнейшее выполнение функции.
Но это только общие прикидки, надо смотреть конкретнее.
[17:17:52] <gds> "откуда я знаю, какие результаты хочу получать" -- то есть, тип должен относиться к самой функции, к её логике работы, а не к вызываемым функциям.
[17:51:41] <gds> (я просто оставлю это здесь)
Подумал, что выделять отдельно чистые считалки ('i -> 'o, ну или нечистые, 'i -> IO.m 'o) в виде "процессов" -- понту мало для локального message passing, так как с тем же успехом можно просто вызвать всё это добро.
Для параллелизации же -- понт есть.
Поэтому надо проектировать так, чтобы такие функции весьма нормально вписывались в общий вид "процессов".
[17:59:31] <gds> далее, избавляться от типа выходящих сообщений -- так просто не выйдет: надо протащить через систему типов то, что функция 'i -> 'o, будучи закатанной в "процесс", будет возвращать именно 'o, чтобы тот, кто её вызывает, знал (1), что получит 'o в качестве ответа.
Но для "процессов" в общем виде -- такая штука не нужна, так как они могут много кому отправлять сообщения, и часто исходящим сообщением будет сообщение "уф, наработалася, выхажу!".
Но "как бы избавиться" -- таки можно, надо для решения проблемы (1) использовать какие-то "очереди", что ли, или "типа-переменные" (очередь на одно сообщение), которые создавать в вызывающем процессе и передавать в процесс-считалку с намёком "будь ласка, запиши результат именно сюда, как закончишь".
[18:01:11] <gds> в связи с этим попробовал поискать в блоге я.минского трюк, который точно там видел, где создавали спрятанную ref (option 'a), и одной функцией заполняли её, а другой -- читали.  Но не могу сходу найти.
[18:01:47] <ygrek> universal type
[18:02:35] <gds> вот же память у тебя, круто.
[18:03:14] <ygrek> точнее свалка с индексом
[18:03:54] <gds> значит дело не в памяти, а в грамотном подходе.  Тоже хорошо.
И да, блог минского и блог janest -- оказалось, разные вещи :]
[18:06:45] <Typhon> http://ocaml.janestreet.com/?q=node/21 вот это искал? (если нет, то это related, к.м.к.)
[18:07:34] <gds> не, искал http://ocaml.janestreet.com/?q=node/18 , но это тоже буду читать обязательно.
[18:08:19] <Typhon> а что за разные блоги? я только вот этот знаю, и он yminsky
[18:08:59] <Typhon> а не, туда другие тоже пишут. тогда где блог минского?
[18:10:55] <gds> я вот отсюда начал поиски: http://ocaml.janestreet.com/?q=blog/5 , и, просмотрев все 4 страницы, не нашёл ничего.
[18:49:42] zert вошёл(а) в комнату
[18:56:49] arhibot вошёл(а) в комнату
[18:57:01] arhibot вышел(а) из комнаты
[19:12:01] <gds> пушнул сюда текущий расклад: https://bitbucket.org/gds/parvel/ , но он мне очень не нравится.
[19:23:59] <gds> нужна обёртка, которая в случае передачи значения в пределах процесса будет просто сохранять это значение и потом отдавать его (Univ.t вроде ок), а в случае передачи в другой процесс -- по-честному, [де]сериализовать.  Туда же в будущем должна втыкаться штука, которая будет использовать shared memory для некоторых вещей.
И да, подразумеваем, что все сообщения -- read only, а иначе б-женька покарает.
[19:37:53] komar вышел(а) из комнаты
[19:39:28] Typhon вышел(а) из комнаты
[19:39:58] komar вошёл(а) в комнату
[19:40:37] Typhon вошёл(а) в комнату
[19:58:15] <superbobry> товарищи, а когда кошерно использовать val?
[19:58:20] <superbobry> и нужно ли вообще
[19:58:42] <superbobry> я тут колдую над странной строчкой на которой у меня syntax error
[19:58:46] <superbobry> let module DB = (val (Db_cache.get __t) : Db_interface.DB_ACCESS) in ...
[20:27:18] komar вышел(а) из комнаты: Replaced by new connection
[20:27:19] komar вошёл(а) в комнату
[20:32:26] <Kakadu> что-то  я не знаю такого синтаксиса
[20:32:42] <Kakadu> может попробовать struct дописать?
[20:33:58] <superbobry> Db_cache.get возвращает модуль, чиста для справки
[20:52:41] superbobry вышел(а) из комнаты
[21:13:37] komar вышел(а) из комнаты
[21:45:25] komar вошёл(а) в комнату
[21:45:50] superbobry вошёл(а) в комнату
[22:10:02] superbobry вышел(а) из комнаты
[22:12:10] superbobry вошёл(а) в комнату
[22:27:20] superbobry вышел(а) из комнаты
[22:35:16] <Typhon> gds, f[x] а вы можете superbobry учаснегом сделать, чтобы ему капчу не предлагали вводить ( его empathy это не умеет)
[22:48:57] <ygrek> done
[22:49:42] <Typhon> спасибо :-)
[22:49:57] superbobry вошёл(а) в комнату
[22:50:11] <superbobry> спасибо товарищи :)
[22:51:02] <ygrek> насчёт val это я так понимаю 3.12, смотри мануал как first-class модули создавать
[22:52:53] <superbobry> мерси, я что то гуглил про val и ocaml и на 3.12 не попал
[23:14:46] <Typhon> скобки не нужны, скорее всего, но проверить негде %)
[23:17:12] <Typhon> *скобки после val
[23:20:37] <ygrek> мне кажется val не нужен
[23:22:31] <superbobry> я пробовал без него -- один фик syntax error
[23:22:59] <ygrek> вспомнил :)
# module X = struct end;;
module X : sig  end
# let x = (module X : T);;
val x : (module T) = <module>
[23:23:09] <ygrek> мануал надо читать, а не научно тыкать
[23:23:22] <ygrek> # module type T = sig end;;
[23:23:38] <superbobry> именно форму (module X : T) я мануале и вычитал
[23:23:52] <ygrek> инлайном сигнатуру нельзя
[23:24:16] <ygrek> а, стоп, это же в обратную сторону
[23:24:26] <superbobry> т.е. чуваки из xensource очепятались?
[23:24:36] <superbobry> *not likely*
[23:24:54] <ygrek> # module Y = (val x : T);;
module Y : T
[23:25:04] <superbobry> хмммм
[23:25:39] <superbobry> это только в 3.12 работает?
[23:25:44] <ygrek> а у тебя точно 3.12?
[23:25:48] <ygrek> ну да
[23:25:49] <Typhon> New kind of module expression, to unpack a first-class value as a module:  (val EXPR : PT).
[23:25:55] <superbobry> у меня 3.11 в том то и фигня
[23:26:02] <ygrek> гг
[23:26:11] <Typhon> а в 3.11 нету же
[23:26:20] <superbobry> ага, а 3.11 в репах нету же
[23:26:25] <superbobry> ну точнее надо искать :)
[23:26:40] <ygrek> 3.12 в тестингепо идее скоро будет
[23:26:47] <superbobry> всем спасибо еще раз, хоть какая то ясность
[23:27:03] <superbobry> CentOS у меня, так шо testing'a нету
[23:27:14] <superbobry> Typhon: а откуда ты это взял? release notes?
[23:27:29] <Typhon> Changes, да.
[23:27:33] <Typhon> http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocaml/release/3.12.0/Changes?rev=10641&view=markup
[23:30:09] <Typhon> а офф.ман что-то, кажется, но обновился на 3.12
[23:30:37] <ygrek> обнвоился
[23:32:33] <ygrek> http://caml.inria.fr/pub/docs/manual-ocaml/manual021.html#toc81
[23:34:02] <Typhon> а, я не там смотрел -- в module system и advanced ex. with classes and modules
[23:40:03] <superbobry> Typhon: а для ocaml'a нет аналогов virtualenv'a?
[23:48:03] <Typhon> chroot %) а так не знаю, не встречал. спрашивал недавно, не имеет ли oasis такого функционала. по крайней мере пока -- нет
[23:48:28] <ygrek> ну chroot то зачем?
[23:48:46] <ygrek> $ ls -1 /opt/
ocaml-3.12.0
ocaml-3.12+svn
[23:48:49] <Typhon> да это я шутку всопмнил про виртуаленв http://twitter.com/#!/dozba/status/38133599408627712
[23:49:58] <superbobry> жаль жаль
[23:50:58] <superbobry> а какой нить штуки для выкачивания пакетов с forge?
[23:52:00] <ygrek> curl :)
[23:52:12] <ygrek> никакой такой инфраструктуры у камля нету
[23:52:21] <ygrek> есть полудохлый godi
[23:52:25] <ygrek> для этого
[23:52:37] <ygrek> но им мало кто пользуется (здесь никто по-моему)
[23:53:12] <ygrek> есть планы это сделать, но сейчас - нету
[23:54:07] <superbobry> /usr/bin/camlp4: fork: Cannot allocate memory
[23:54:12] <superbobry> аррр, поставил rpm
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!