Home
Objective Caml
ocaml@conference.jabber.ru
Понедельник, 17 августа 2009< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся!
Конфигурация комнаты

GMT+4
[04:04:02] daapp вошёл(а) в комнату
[06:33:34] john вышел(а) из комнаты
[07:12:01] john вошёл(а) в комнату
[08:24:46] gds вышел(а) из комнаты
[09:06:04] gds вошёл(а) в комнату
[09:08:18] <gds> из caml-list о том, как Jane Street используют окамл:
P.S. From what I gather Jane Street uses ocaml to get rich by sending golden coins to itself back in time through tiny short-lived quantum loops in the spacetime continuum. They invest the golden coins that trickle in. When the investments result in profit, they send the profit back in time again, to get even more golden coins in the past. The Ocaml programmers are responsible for computing the telemetry of the coins in real time without numerical errors.
[09:10:20] gds вышел(а) из комнаты: Replaced by new connection
[09:10:21] gds вошёл(а) в комнату
[09:20:19] gds вышел(а) из комнаты: Replaced by new connection
[09:20:20] gds вошёл(а) в комнату
[09:54:13] sevenov вышел(а) из комнаты: Replaced by new connection
[09:54:15] sevenov вошёл(а) в комнату
[09:56:09] Typhon вошёл(а) в комнату
[10:20:45] ygrek вошёл(а) в комнату
[10:29:32] ygrek вышел(а) из комнаты
[10:29:33] ygrek вошёл(а) в комнату
[10:34:12] sceptic вошёл(а) в комнату
[11:10:44] f[x] вошёл(а) в комнату
[11:23:10] sceptic вышел(а) из комнаты
[11:27:05] sceptic вошёл(а) в комнату
[11:27:59] sceptic вышел(а) из комнаты: Replaced by new connection
[11:28:03] sceptic вошёл(а) в комнату
[11:56:53] <gds> а мы уже умеем так, благодаря специально обученным комбинаторам:
value pif =
int_interval 1 max_int >>- fun i ->
int_interval 1 i >>- fun j ->
inner (i+1)
where rec inner k =
match compare (i*i + j*j) (k*k) with
[ r when r > 0 -> inner (k+1)
| 0 -> return (i, j, k)
| _r (* when r < 0 *) -> mzero
];
value () = runL (Some 100) pif >>
print_gen_list (fun (i,j,k) -> Printf.sprintf "(%i, %i, %i)" i j k);
думаю, чего бы около-логического около-переборного набросать для проверки модуля.
[12:59:30] sevenov вышел(а) из комнаты: Replaced by new connection
[12:59:32] sevenov вошёл(а) в комнату
[13:29:41] john вышел(а) из комнаты
[13:42:59] john вошёл(а) в комнату
[13:56:08] <f[x]> poor man's l11n:
class en = object
method open_file = "Open file"
method quit = "Quit"
end
class ru = object
inherit en
method quit = "Выйти"
end
[13:56:52] <gds> прилично.
[13:58:01] <gds> конечно, записи тоже такое умеют, типа let ru = { (en) with quit = "Выйти" }
[13:59:48] <f[x]> о, и писать меньше
[14:00:05] <f[x]> правда минус в том что исопльзование неудобно
[14:01:05] <gds> да, реально минус.
[14:01:22] <f[x]> хотя нет
[14:01:28] <f[x]> т.е. с классами let l = new Lang.ru и l#open_file вместо "Open file"
[14:01:40] <f[x]> а с рекордами можно let L = Lang и L.open_file
[14:01:46] <f[x]> module L = Lang
[14:02:07] <f[x]> ещё раз нет :)
[14:02:11] <gds> не выйдет так.
[14:02:14] <f[x]> минус в том что тип рекорда надо описывать!
[14:02:36] <gds> ещё минус в том, что l.L.open_file
[14:04:04] <f[x]> да, точно
[14:05:49] Mon вышел(а) из комнаты
[14:06:00] Mon вошёл(а) в комнату
[14:07:39] <gds> ещё не ясно, что делать для возможности выбора языка в рантайме. l.val#open_file -- неудобняк.
[14:10:26] <gds> и ещё плюс метода -- method print_shit shit_amount = sprintf "вот сколько -- аж %.2fкг кала!" shit_amount (на случай, когда единственное/множественное число по-разному пишутся, или разный порядок слов во фразе, очень полезно, что язык -- это не простые строки, а живой код).
[14:27:37] gds вышел(а) из комнаты: Replaced by new connection
[14:27:38] gds вошёл(а) в комнату
[14:38:24] daapp вышел(а) из комнаты
[15:05:39] <f[x]> !l вместо l.val :)
[15:22:08] Mon вышел(а) из комнаты
[15:22:24] Mon вошёл(а) в комнату
[15:38:20] <ermine> хнык
[15:39:21] ermine продолжает влачить жизнь унылого быдлокамлокодера
[15:42:10] <ermine> кстати о рекордах, оказывается чоли можно использовать такую конструкцию: { ModuleName. v1 = z1; v2 = z2}
[15:43:09] <gds> быть быдлокодером на окамле -- безопаснее, чем на многих других языках. Радоваться надо.
А про ModuleName -- вполне логично, ведь синтаксис доступа к полям записи подразумевает модули.
[15:44:35] <ermine> а вот модуленаме надо указывать только в начале записи
[15:44:46] <ermine> я не знала этого :)
[15:44:58] <ermine> и приставляла к каждому полю
[15:45:30] <gds> так я тоже. Более того, раньше только так и делали, вроде.
[15:46:38] <ermine> каких только открытий не сделаешь, лазая просто по чужим блогам вместо вдумчивого чтения документации
[15:49:54] <ermine> а еще интересно понять, во что разворачивается при компиляции конструкция вида let something = let module Z = Something(Whatewer) in Z.whatelse
[15:51:05] <gds> вроде в инициализацию "таблицы модуля" Z (список всех top-значений модуля).
[15:51:30] <ermine> а еще бы понять как это можно применить на практике в своем быдлокоде, чтобы кто-то жмурился от удивления
[15:52:13] DiGiTAL_CuRSe вошёл(а) в комнату
[15:52:30] <ermine> gds: и вставка будет толще чем при обычном коде без извратов?
[15:52:54] <gds> ненене, лучше сделать так, что код легко было поддерживать! нежели удивляться тому, "чо за хня тут написана и как это работает?".
вставка -- толще, конечно. Насколько -- не знаю.
[15:55:22] <ermine> да я все еще мучаюсь со своим вчерашним хныком
[15:56:43] <gds> так описывай же, говорил.
[15:58:24] <ermine> на вход подаются три блока данных, в случайной последовательности. Вот надо определить по ним, какой евент наступил, чтобы вызвать калбэк с нормализованными данными
[15:59:57] <ermine> и при этом не хочется использовать всякие рефы и мутаблы :)
[16:00:40] <ermine> а входные данные видны типа в List.iter
[16:01:53] ermine по сути пытается красиво отработать протокол чатов в этом яббере
[16:02:30] <gds> moar... gimme moar info...
фолдом проходись, временную структуру заполняй (например, запись/объект из 'a option), а потом матчь её, собирая найденные данные.
[16:02:31] <ermine> простой пример: приходит презенс с типом оналйн или оффлайн, в нём вкладыши от одного до двух дополнительных данных
[16:03:12] <ermine> по одному из владышей определяют истинное значение презенса, а другой вкладыш просто апдейтит базу по юзерам
[16:06:04] <ermine> сейчас обдумываю как применить fold для аккумуляции (ну я хотела типы с партиал аппликешном)
[16:06:56] <gds> да вроде тут типы конкретнее некуда.
[16:08:16] <ermine> вербализовать типы тяжко
[16:08:35] <gds> нехай тайпчекер с ними парится. у него голова большая.
[16:08:37] <ermine> разве что оставить тип string :)
[16:08:46] <ermine> с возможностью опечататься
[16:09:58] <gds> в таких случаях хороши полиморфные варианты и объекты -- не надо объявлять типы заранее. А если на выходе ограничить функцию человеческими типами и включить предупреждение, получишь как бы гарантию того, что внутри функции работа с этими "гибкими" типами ведётся нормально.
[16:10:57] <ermine> я стараюсь пореже юзать полиморфные варианты
[16:11:18] <ermine> а сейчас у меня такой этап жизни, что и sum тоже пытаюсь пореже юзать
[16:11:26] f[x] вышел(а) из комнаты: Replaced by new connection
[16:11:31] f[x] вошёл(а) в комнату
[16:13:11] <ermine> при этом не допуская возможность опечаток
[16:13:37] <ermine> потому что sum дико мешают там где хочется сделать динамическую линковку
[16:15:20] <gds> можешь поподробнее про динамическую линковку рассказать, как и чем мешают?
[16:15:23] <f[x]> почему мешают:?
[16:15:26] <f[x]> мне тоже интересно
[16:16:09] <ermine> они не рассматривают все случаи жизни
[16:16:32] <ermine> сделаешь новый плагин и возникнет потребность помодифицировать sum
[16:16:38] <ermine> ну нафик
[16:17:42] <f[x]> ну как бы описать типы один раз и никогда их не менять и сохранить нормальную статическую типизацию (т.е. константы инты и void* не катят) - не получится
[16:18:03] <ermine> а без sum в некоторых плагинах тоже тяжко, особенно когда они привязаны к определенному типу евентов
[16:18:09] <f[x]> т.е. api/abi основного модуля постоянно развивается - плагины надо перекомпиливать
[16:18:43] <f[x]> я как бы не вижу выхода. с другой стороны если ты не планируешь раздавать бинарные плагины - то это не особая проблема (?)
[16:20:31] <ermine> в общем, пытаюсь жрать кактус и не рыдать
[16:21:39] <ermine> f[x]: это хорошо, когда с ходу видишь как описать типы
[16:21:55] <ermine> мне б такое счастье
[16:24:33] ygrek вышел(а) из комнаты
[16:24:34] ygrek вошёл(а) в комнату
[16:25:25] <ermine> а че это вас тут два?
[16:25:56] <ermine> я одно время думала что ygrek и f[x] - две разные личности
[16:26:31] <gds> это специальный трюк, чтобы увеличить количество участников конфы ;)
[16:31:16] <f[x]> f[x]: я тоже часто меняю типы. хорошо что камль позволяет это делать безболезненно
[16:31:20] <f[x]> тьфу
[16:31:28] <f[x]> ermine: :)
[16:33:02] <ermine> а вот експшны - с партиал аппликешном?
[16:34:53] <ermine> f[x]: я тут каждый день меняю типы, перепахиваю ради этого три десятка файлов исходников
[16:38:23] john вышел(а) из комнаты: Replaced by new connection
[16:38:24] john вошёл(а) в комнату
[16:39:30] <gds> exceptions -- без partial. к щастю.
[16:39:56] <ermine> не факт
[16:42:32] <ermine> а видимо да, без аппликешна
[17:26:02] sceptic вышел(а) из комнаты
[17:33:59] sceptic вошёл(а) в комнату
[17:55:33] gds вышел(а) из комнаты
[18:23:09] gds вошёл(а) в комнату
[18:27:56] DiGiTAL_CuRSe вышел(а) из комнаты
[18:33:03] sevenov вышел(а) из комнаты: Replaced by new connection
[18:33:05] sevenov вошёл(а) в комнату
[18:34:59] DiGiTAL_CuRSe вошёл(а) в комнату
[19:05:55] john вышел(а) из комнаты: Replaced by new connection
[19:05:56] john вошёл(а) в комнату
[19:09:39] sevenov вышел(а) из комнаты: Replaced by new connection
[19:09:43] sevenov вошёл(а) в комнату
[19:12:29] ygrek вышел(а) из комнаты
[19:18:37] sevenov вышел(а) из комнаты
[19:18:49] sevenov вошёл(а) в комнату
[19:33:16] Typhon вышел(а) из комнаты
[20:24:41] f[x] вышел(а) из комнаты: Computer went to sleep
[20:29:58] <ermine> если переписывать тот же код раз 50 на дню, он становится лучше?
[20:30:57] <sevenov> ermine, ну если просто переписывать, то нет, если же в этот момент что-то меняется, то возможно да :)
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!