Home
OCaml (aka Objective Caml), а также прочие ML'и, F#, Coq, etc
ocaml@conference.jabber.ru
Четверг, 3 октября 2013< ^ >
f[x] установил(а) тему: OCaml / ОКэмл / Камль -- http://ocaml.org/ | Камло - http://camlunity.ru/ | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ | Fight FUD with fire | Мойте руки перед чатом | KEEP CAML AND CURRY ON | F#, Coq - де-факто онтопик
Конфигурация комнаты
Участники комнаты

GMT+4
[01:24:38] Kakadu вышел(а) из комнаты
[04:26:08] ftrvxmtrx вошёл(а) в комнату
[05:13:06] tilarids вошёл(а) в комнату
[05:37:53] f[x] вошёл(а) в комнату
[05:44:37] f[x] вышел(а) из комнаты
[06:25:41] tilarids вышел(а) из комнаты: Machine going to sleep
[06:28:19] f[x] вошёл(а) в комнату
[07:47:57] komar вышел(а) из комнаты: Replaced by new connection
[07:47:57] komar вошёл(а) в комнату
[09:39:26] komar вышел(а) из комнаты: Replaced by new connection
[09:39:26] komar вошёл(а) в комнату
[09:44:12] f[x] вышел(а) из комнаты
[10:29:32] f[x] вошёл(а) в комнату
[10:46:59] ermine вошёл(а) в комнату
[11:05:00] komar вышел(а) из комнаты: Replaced by new connection
[11:05:00] komar вошёл(а) в комнату
[11:37:13] komar вышел(а) из комнаты: Replaced by new connection
[11:37:13] komar вошёл(а) в комнату
[11:40:41] Zbroyar вошёл(а) в комнату
[11:41:36] Zbroyar вышел(а) из комнаты
[12:03:48] Typhon вошёл(а) в комнату
[12:04:52] Kakadu вошёл(а) в комнату
[12:30:40] <gds> выяснил, что weak-значения гарантированно подчищаются после Gc.full_major ().  Но насколько гуманно вызывать таковую сборку мусора, чтобы избежать, скажем, записи лишних 50*200байтов в файл?
[12:34:57] <f[x]> отдай решение юзеру
[12:37:08] <gds> логично.  Но сначала попробую избежать обоих этих говен другими средствами.
Эхля, жаль, что никому не интересны извраты с rtti и прочими universal types, приходится самому мозги ломать.
[12:40:59] <f[x]> как никому?
[12:41:20] <f[x]> пвсе кому интересны пытаются запихнуть это в компилер
[12:41:48] <gds> ну да.  Страшно спрашивать, как у них успехи.
[12:41:53] <f[x]> ты бы поучаствовал чтобы потом не плеваться что всё-не-так-сделали
[12:42:18] <f[x]> with sufficient thrust, even rtti can fly
[12:42:37] <gds> в оригинале фраза была про ёжиков?
[12:42:48] <f[x]> про pigs вроде
[12:42:49] <gds> а где там участвовать?
[12:44:32] <f[x]> а вот хз, caml-list для начала, может быть wg-camlp4 или ocaml-platform (там обсуждают вообще всё подряд насчёт языка, не только платформу)
[12:45:16] <f[x]> насколько я помню основные инициаторы в lexifi так что готовься встретить своих заклятых друзей
[12:46:28] <gds> да они мне не особые друзья/недруги.  у анал прыща всего лишь имя смешное, отрицательных чувств к нему не испытываю.
[12:49:56] <gds> про caml-list подумаю.  Но сначала надо текущие проблемы решить, а для этого мозги ломать в пределах моих наработок, а не их.
У меня же не только и не столько rtti -- ещё universal type, структурная [де]композиция значений, расширение динамически-доступных методов, недавно даже наследование rtti налепил (знал, что если я сделаю это, я поменяюсь навсегда).
[12:55:42] <gds> ну вот, поныл в чятике -- и вроде нащупал решение проблемы, над которой джва дня уже думаю.  благодарю вас, мои резиновые уточки!11
[12:57:27] ForNeVeR вышел(а) из комнаты
[13:07:24] tilarids вошёл(а) в комнату
[13:08:57] <gds> чисто интуитивно, что выгоднее -- if not Hashtbl.mem then Hashtbl.add или Hashtbl.replace?  (при условии того, что постановка задачи гарантирует их семантическую эквивалентность.)
[13:11:02] <f[x]> одинаково
[13:19:42] <aleksey> замерь
[13:20:51] <aleksey> интуитивно если много добавлений того что есть, то первый вариант, иначе второй
[13:22:04] <gds> f[x]: странно, это не очень согласуется с моей интуицией.  Поэтому полез копать.
mem -- в худшем случае проход по всему бакету, только чтение.
add -- создание одного значения (в нужный бакет спереди клеим Cons).
replace -- пересоздание всего бакета, и, если не нашли, делается то же, что в add.
явно replace даёт бОльшую нагрузку на мусорщик.
[13:23:20] <aleksey> бакеты обычно очень маленькие
[13:23:58] <gds> вроде порядка "sqrt количество_элементов" в среднем.
[13:24:13] <aleksey> O(1)
[13:24:46] <aleksey> операции в хэш-таблицах O(1) занимают в среднем
[13:25:02] <gds> не думаю:
if h.size > Array.length h.data lsl 1 then resize hash h
[13:26:12] <aleksey> так это амортизированно всё равно O(1)
[13:26:29] <gds> где там амортизация?
[13:26:37] <aleksey> если n операций требуют O(n) времени, то амортизированно O(1)
[13:26:40] <gds> то есть, инвариант там такой: размер бакета не больше, чем 2 * количество бакетов.
[13:27:21] <aleksey> мнэ
[13:27:30] <aleksey> h.data это ж не бакет, это их массив
[13:27:37] <f[x]> replace пересоздаёт бакет только если нашли же?
[13:27:43] <f[x]> а если не нашли - то это add
[13:28:02] komar вышел(а) из комнаты: Replaced by new connection
[13:28:02] <f[x]> т.е. это mem + add в одной функции с потенциалом к инлайну
[13:28:02] komar вошёл(а) в комнату
[13:28:38] <gds> f[x]: http://paste.in.ua/8816/
[13:29:04] <gds> aleksey: минутку, я протупил, разбираюсь сейчас.
[13:29:24] <f[x]> ну я видел
[13:29:32] <f[x]> бакет не создаётся если не найдено
[13:29:38] <f[x]> только стек откладывается
[13:31:18] <gds> f[x]: да, логично.  Но, если найдено значение, таки пересоздаётся всё, что до него было в бакете.  В среднем "размер бакета / 2" выделений.  А в add -- 1 выделение.
[13:31:32] <f[x]> соответственно зависит от кол-ва коллизий - т.к. тогда mem будет лишним проходом
[13:32:04] <f[x]> ыыы. так если найдено значение то в обоих случаях пересоздаётся бакет
[13:32:21] Typhon вышел(а) из комнаты
[13:32:27] <gds> именно.  Так надо для правильности replace.
[13:32:37] Typhon вошёл(а) в комнату
[13:32:41] <f[x]> а, стой, ты имел ввиду if not mem then add else replace или просто if not mem then add ?
[13:33:12] <gds> я имел в виду "if not mem then add else ()"
[13:33:26] <f[x]> а, тогда согласен :)
[13:33:35] <f[x]> это даже для ref справедливо
[13:33:36] <gds> aleksey: разобрался.  правильно так: "ресайз -- если количество элементов в хештаблице больше, чем 2 * количество бакетов".  То есть, в среднем случае окажется, что в бакете будет 1..2 элемента.
[13:33:46] <gds> про ref не понял, пояснишь?
[13:34:08] <f[x]> r := x -----> if !r <> x then r := x
[13:34:23] <gds> (кстати, я смотрю исходники 3.12 штоле.  в 4 более умные хештаблицы, с элементами случайности.)
[13:34:33] <gds> а тут в чём прикол?
[13:35:13] <gds> чтобы не подкидывать мусорщику работы по поводу старого значения r.val, которое меняем, пусть даже на себя же?
[13:35:29] <f[x]> := это caml_modify
[13:35:56] <f[x]> которая чего-то там много жрёт, то ли кашу портит, то ли в page table лукапит
[13:37:44] <gds> да, логично.
А чего бы тогда не сделать
let ( := ) r x = if !r != x then r := x else ()
[13:38:28] <f[x]> потому что сравнивать не всегда дёшево %)
[13:38:41] <gds> это же физическое сравнение.
[13:38:41] <f[x]> и не всё можно сравнивать
[13:39:02] <gds> впрочем, тут ещё и ветвление есть.
[13:40:46] <f[x]> хм, да, физическое наверное можно было бы и всегда проверять..
[13:42:29] <gds> а нет ли такой шняги, типа "заменить содержимое по указателю и вернуть старое значение", или "заменить и вернуть признак, реально ли заменили"?  А потом по сравнению нового-старого или по этому признаку запускать caml_modify.
[13:48:29] <f[x]> cmpxchg? наверное оно эквивалентно сравнению и замене
[13:48:41] <f[x]> или оно по дефолту локает запись - тогда дороже
[14:01:40] <gds> я тут подумал -- ведь случаи, когда присваивают одно и то же, в среднем редки.  А проверка -- лишние действия.  Разве что если по задаче видно, что присвоения одинакового достаточно вероятны, тогда есть смысл проверять.
[14:02:13] <f[x]> угу
[14:19:06] komar вышел(а) из комнаты: Replaced by new connection
[14:19:07] komar вошёл(а) в комнату
[14:21:13] komar вышел(а) из комнаты: Replaced by new connection
[14:21:13] komar вошёл(а) в комнату
[14:26:50] komar вышел(а) из комнаты: Replaced by new connection
[14:26:50] komar вошёл(а) в комнату
[14:31:34] komar вышел(а) из комнаты: Replaced by new connection
[14:31:35] komar вошёл(а) в комнату
[14:36:27] ForNeVeR вошёл(а) в комнату
[15:15:38] ftrvxmtrx вышел(а) из комнаты
[15:54:18] f[x] вышел(а) из комнаты
[15:54:35] tilarids вышел(а) из комнаты: Machine going to sleep
[16:22:38] komar вышел(а) из комнаты: Replaced by new connection
[16:22:38] komar вошёл(а) в комнату
[16:32:17] komar вышел(а) из комнаты: Replaced by new connection
[16:32:18] komar вошёл(а) в комнату
[16:41:47] Kakadu вышел(а) из комнаты
[16:55:45] Kakadu вошёл(а) в комнату
[17:38:57] Kakadu вышел(а) из комнаты
[17:44:56] f[x] вошёл(а) в комнату
[17:50:29] tilarids вошёл(а) в комнату
[18:01:38] Typhon вышел(а) из комнаты
[18:06:50] Typhon вошёл(а) в комнату
[18:34:48] kevinn. вошёл(а) в комнату
[19:02:12] Typhon вышел(а) из комнаты
[19:07:37] Typhon вошёл(а) в комнату
[19:24:24] tilarids вышел(а) из комнаты
[19:38:57] tilarids вошёл(а) в комнату
[19:45:28] Typhon вышел(а) из комнаты
[19:49:00] kevinn. вышел(а) из комнаты
[20:00:29] komar вышел(а) из комнаты: Replaced by new connection
[20:00:31] komar вошёл(а) в комнату
[20:00:43] tilarids вышел(а) из комнаты: Machine going to sleep
[21:01:00] komar вышел(а) из комнаты
[21:01:09] komar вошёл(а) в комнату
[21:10:23] Ankoù вошёл(а) в комнату
[21:10:42] <Ankoù> добрый вечер
[21:13:57] <Ankoù> а тут раньше, я помню, пилили биндинги к qt
[21:14:20] <Ankoù> никто не знает, в каком они состоянии?
[21:16:00] olibjerd вошёл(а) в комнату
[21:16:19] <gds> если интересно, некто Kakadu из этого чятика может рассказать подробности.
насколько я помню, кое-что прилично работает.
[21:16:47] <Ankoù> а во сколько его обычно можно застать?)
[21:17:19] <f[x]> он сейчас по-моему чаще в irc появляется (ренегат)
[21:18:05] <Ankoù> в каком-нибудь #ocaml на фриноде?
[21:22:13] <gds> если вспоминать ссылки, то https://github.com/Kakadu/lablqt/wiki и соответственно репка там же.
[21:26:43] <Ankoù> дякуемо, почитаю
[21:27:11] <Ankoù> раз уж там даже qtquick2 есть
[21:28:07] <gds> но лучше найти виновника торжества.
[21:28:32] <gds> для кристалльной ясности ощущений.
[21:31:26] <Ankoù> и вкуса
[21:31:27] <Ankoù> понял)
[21:34:40] <gds> и вкуса.  ох уж эти книжки с их пассивным словарным запасом.
[21:37:05] f[x] вышел(а) из комнаты
[21:49:51] komar вышел(а) из комнаты: Replaced by new connection
[21:49:51] komar вошёл(а) в комнату
[22:04:52] Kakadu вошёл(а) в комнату
[22:09:03] <gds> Kakadu: Ankoù: вам наверное интересно, зачем я вас здесь собрал?  :]
[22:09:37] <Kakadu> я тут
[22:09:48] <Ankoù> gds: к нам едет gtk?
[22:10:15] <Ankoù> Kakadu: на самом деле я хотел узнать, что там и как с lablqt?
[22:10:24] <Ankoù> насколько им можно пользоваться
[22:10:51] <Kakadu> А что надо?
[22:11:55] <Kakadu> Я сейчас на нём ворганю что-то типа камлобраузера
[22:12:46] <Ankoù> я там видел что-то про qtquick2 даже
[22:12:50] <Ankoù> это правда?)
[22:13:13] <Kakadu> "даже" несовсем уместно. Там только QtQuick2
[22:13:35] <Kakadu> опам есть?
[22:13:47] <Ankoù> есть
[22:13:57] <Ankoù> в нём я кстати lablqt почему-то не нашёл)
[22:14:09] <Kakadu> http://kakadu.github.io/lablqt/ там внизу
[22:15:29] <Ankoù> а, там отдельный источник надо добавлять
[22:15:51] <Kakadu> Просто оно какое-то нполноценное, чтобы его в главный опам пихать
[22:16:28] <Kakadu> Я и хотел какое-нить полезное демоприложение сделать, чтобы понять что ему надо и чего не хвататет
[22:16:35] <Kakadu> вот, нашел кое-что даже
[22:16:49] <Kakadu> Сейчас застрял с непонятках в кутэ
[22:17:28] <Kakadu> А вы с C++, Qt, qtquick, OCaml как?
[22:17:53] <Ankoù> в целом более-менее)
[22:18:08] <Ankoù> я сюда в прошлый раз под ником torkve заходил)
[22:29:07] <Kakadu> Так для чего оно вам надо, гуй писать?
[22:30:29] <Ankoù> ага
[22:30:52] <Ankoù> я начал было на гтк писать, потому что он в дефолтных репах есть, но это так мерзко
[22:30:52] <Kakadu> Гуй как саперчик или как Visual Studio? :)
[22:31:02] <Ankoù> скорее как сапёрчик)
[22:31:15] <Kakadu> Тогда думаю, что всё будет ОК
[22:43:37] ftrvxmtrx вошёл(а) в комнату
[23:04:04] olibjerd вышел(а) из комнаты
[23:35:11] Ankoù вышел(а) из комнаты: Disconnected: closed
[23:50:48] ftrvxmtrx вышел(а) из комнаты
[23:51:03] ermine вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!