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

GMT+3
[00:26:04] <ermine> ygrek: а чо нашот Sql.Fold.create_table?
[00:26:45] ermine задумалась - а не использовать ли это, чтобы оно возвращало unit :)
[00:28:53] <ermine> осталось обдумать еще одну заморочку и можно будет закоммитить в гит
[00:29:07] <ygrek> а что с ним? должно быть идентично Sql.create_table
[00:29:44] <ermine> а зачем они в модуле фолда?
[00:30:58] <ygrek> если фолды годятся то я просто заменю Sql на Sql.Fold
[00:31:32] <ermine> они не всегда годятся
[00:31:53] <ermine> например в том случае, когда надо сделать выборку из выборку и остановить
[00:32:25] <ygrek> и как? и в том и в другом случае - exn
[00:33:30] <ermine> щас переделаю последний нефолдовский селект в фолдовский и погляжу
[00:34:05] <ygrek> с другой стороны передавать dummy () там где семантика fold'а не нужна - лениво
[00:35:01] ygrek думает не сильно ли мы тут оффтопим. если кого-то напрягает - говорите.
[00:36:01] <ermine> это вряд ли оффтопик - это стиль программеража
[00:36:41] <ermine> не получицо переделать в фолд
[00:36:53] ygrek snores and quits
[00:55:05] <ermine> выкинула все рефы
[00:55:13] <ermine> код той функции сократился на треть
[00:55:19] <ermine> мелочь, а приятно
[00:55:53] michael.holub вошёл(а) в комнату
[00:58:56] michael.holub вышел(а) из комнаты
[01:00:29] ygrek вышел(а) из комнаты
[03:01:01] daapp вошёл(а) в комнату
[07:45:07] geovit вошёл(а) в комнату
[08:03:22] iNode вошёл(а) в комнату
[08:13:43] gds вышел(а) из комнаты
[08:48:32] Typhon вышел(а) из комнаты
[09:04:56] gds вошёл(а) в комнату
[09:12:09] aloner2k вошёл(а) в комнату
[09:50:41] aloner2k вышел(а) из комнаты
[09:54:16] ygrek вошёл(а) в комнату
[10:05:23] <gds> ygrek: насчёт итерации в sqlgg -- когда fold/callbacks задолбают в плане прерывания итерации через exception, будет самое время делать интерфейс на Stream'ах :)
[10:08:47] gds вышел(а) из комнаты
[10:09:22] gds вошёл(а) в комнату
[10:54:40] sevenov вышел(а) из комнаты
[11:33:49] ygrek вышел(а) из комнаты
[11:54:36] ygrek вошёл(а) в комнату
[12:13:29] f[x] вышел(а) из комнаты
[12:13:39] f[x] вошёл(а) в комнату
[12:15:35] <f[x]> gds: stream/enum хорошо, только нужно при использовании не забывать оставаться в scope с открытым коннектом к базе. т.е.
let (e:string Enum.t) = with_db (fun db -> Sql.select_enum db ~n:100)
не годится
[12:17:25] <f[x]> но интерфейс получается удобный, проблема только в том что Stream достаточно убог (нет fold'а), а Enum - это зависимость на ExtLib (мне-то пофиг, но для захвата мира не годится), а писать свой ленивый список - лениво
[12:18:10] <gds> Stream -- не ленивый список принципиально, и ленивым списком не обойдёшься.
[12:18:45] <gds> Stream убогий, но можешь поставлять с библиотекой также функцию fold_stream.
[12:19:28] <gds> насчёт scope коннекта -- предлагаю поступить тупо, ровно так, как сейчас с channels.
[12:19:31] <f[x]> как это stream не ленивый список? я не говорю что там внутри lazy используется, но суть в том что функция построения следующего элемента и хвоста вызывается отложенно, по запросу
[12:23:43] <f[x]> Как по мне что stream, что enum, что ленивый список суть эквивалентны (с точки зрения одного прохода по последовательности, минимальный итератор). Не так?
[12:39:58] <gds> если брать философию, то stream -- не ленивые данные, а "коданные". В ленивом списке мы имеем возможность обращаться со списком как со значением, которое вычисляется при необходимости (и, возможно, таки вычислится; в этом случае оно эквивалентно обычным данным (строящимся индуктивно), которые могут быть построены из nil + cons энергичным путём). Ключевым моментом stream (как и коданных в целом) является то, что базовый примитив там не конструирование, а разрушение текущего значения. Самый интересный практический вывод из этого -- stream позволяет не создавать список для того, чтобы пробежать по нему. Соответственно, в памяти сам stream принципиально держит максимум одну запись, независимо от оптимизаций, от сборщика мусора, от объявления в top value / let-in, от байткода/нативкода. А ленивый список -- тут уж как реализуешь. Случайно забудешь голову в памяти -- и будь готов принять всё значение в память.
[12:41:19] <sceptic> Stream же как генератор работает
[13:10:53] ermine проверила, нет ли обновлений в sqlgg после вчерашнего
[13:11:09] geovit вышел(а) из комнаты
[13:16:56] geovit вошёл(а) в комнату
[13:19:16] <f[x]> gds: внушительно
[13:23:37] sevenov вошёл(а) в комнату
[13:25:18] sceptic вышел(а) из комнаты
[13:35:21] sceptic вошёл(а) в комнату
[13:42:58] daapp вышел(а) из комнаты
[14:17:00] Typhon вошёл(а) в комнату
[14:58:27] sceptic вышел(а) из комнаты: Replaced by new connection
[14:58:33] sceptic вошёл(а) в комнату
[15:01:32] sceptic вышел(а) из комнаты: Replaced by new connection
[15:01:37] sceptic вошёл(а) в комнату
[15:03:28] sceptic вышел(а) из комнаты: Replaced by new connection
[15:03:33] sceptic вошёл(а) в комнату
[15:13:22] sceptic вышел(а) из комнаты
[15:41:59] geovit вышел(а) из комнаты
[15:45:53] geovit вошёл(а) в комнату
[15:54:23] <ermine> gds: что эффективнее: цепочка if'ов с триггерами на выполнение функций или список с партиал аппликешнами, причем списков может быть много?
[15:55:02] <ermine> gds: вкуснее выглядит список партиалов, но боязно как-то держать сотни таких списков
[15:55:53] sceptic вошёл(а) в комнату
[15:56:03] ermine пытается доделать последний плугин сульци и додумать концепцию более тонкой конфигурации
[16:00:56] <ermine> f[x]: жалко, что в sql нет полей типа option
[16:01:13] <gds> ermine: зависит от условий. Если нужно экономить такты и можно всё оформить статически, то if'ы. Однако задача не ясна.
[16:01:21] <ermine> почти задолбалась иметь по два варанта sql
[16:01:56] <gds> жалко, что в sql нет sum types вообще. А null'ы в sql таки есть. Правда вот не option это, если в общем.
[16:02:52] <ermine> gds: список функций - это цепочка хуков, хук - это функция из первого элемента списка, получающая в числе своих аргументов хвост списка
[16:03:47] <ermine> gds: щас я строю такой список посессионно, а вот следующий уровень искусства - это уникальная система хуков в каждой конференции
[16:04:33] <gds> список -- вполне гибкий подход. по идее, довольно эффективно будет. но не ясно, как это переписать в if'ы -- список что ли известен на этапе компиляции?
[16:05:08] <ermine> gds: например, логгирование конференции - это хук, который встраивается в определенное место списка. Если логгирование в конкретной конфе не нужно, то это можно решать двумя способами - с помощью if какого-то пункта конфига или попросту построить нужный список
[16:06:03] <ermine> списки можно создавать на старте сессии (в любом контексте), и потом хранить где-то, а можно не хранить, а пересоздавать каждый раз заново, когда придет пакет данных
[16:06:13] <f[x]> ermine: это ты про опциональные условия WHERE x = ?
[16:07:04] <ermine> f[x]: в where чтоб вставляло field=value, если value типа int option, и он в данный момент не None :)
[16:07:48] <ermine> а про вопросительный знак я чота не знаю
[16:09:28] <ermine> а prepare оно может проверять перебором всех вариантов
[16:09:38] <ermine> так что наверное теоретически реализовать можно
[16:09:43] <ermine> но это вкусная няшка
[16:09:56] <gds> ermine: проще оставить список функций как у тебя сейчас, и строить список для "единицы общения" -- для конфы в muc-случаях, для человека в случаях "личных" ботов, для программы целиком в случае "публичных" ботов.
[16:11:44] <f[x]> ermine: согласен
[16:12:28] <ermine> gds: список формируется из того, что в конфиг-файл включено, ты в своем абзаце не показал, как проверять условие "няшка включена"
[16:12:38] <ermine> ладно
[16:12:44] <ermine> сама как-нить рожу
[16:13:23] <gds> а как это "вставлять field=value" для int option? в случаях "where a=? and b=?" и в "where a=? or b=?" чтобы работало одинаково?
[16:14:14] <ermine> ну where - это список
[16:14:21] <ermine> если список пуст, то зачем where?
[16:14:35] <gds> хехе, это не список, а выражение. зачастую довольно сложное.
[16:15:01] <f[x]> это предикат если быть точным
[16:15:15] <gds> во.
[16:15:35] <f[x]> разбивается на список предикатов объединённых or/and
[16:15:47] <f[x]> думаю надо эти option синтаксически выделять
[16:15:55] <f[x]> т.к. не всегда они нужны
[16:16:31] <gds> ещё один вариант семантики -- перерисовывать Some x в "field=x" и None в "field is null".
[16:16:44] <f[x]> например where x = @v1? and y = @v2 -- v1 опциональный, v1 обязательный
[16:17:06] <f[x]> хм
[16:17:20] <ermine> это не null
[16:17:31] <ermine> тьфу
[16:17:34] <f[x]> null тоже надо учитывать
[16:17:39] ermine тормоз
[16:17:42] <f[x]> тогда слишком сложно получается
[16:18:07] <gds> то есть, самодорисовывающиеся условия и нуллы учитывать надо по-разному. пока нуллы вообще не учитываются, и, если они не нужны, лучше забить на них пока.
[16:18:08] <ermine> f[x]: тогда да, option придется оставить для null
[16:18:13] <ermine> оно логичнее
[16:19:19] <gds> не факт, что логичнее: sql плохо типизирован, и значение типа null может принадлежать любому типу. Это нормально учли в ocamldbi, сделав тип значений [ `Null | `Int of int | `String of string | ... ]
[16:20:04] <f[x]> ну если колонка объявлена not null то нет
[16:20:21] <f[x]> у меня большинство таблиц с not null и я хочу это учитывать
[16:20:40] <f[x]> во-вторых синтаксис сравнения на null отличается
[16:20:48] <gds> кроме значений колонок бывают и другие выражения.
про not null и сравнения -- ага, имеешь право.
[16:21:32] <f[x]> gds: в том и трабла, чтобы трекать null'и (и тип вообще) надо проверять всё выражение с учётом семантики функций
[16:21:43] <f[x]> сейчас тип протягивается но с ограничениями
[16:23:27] <gds> о да, семантику надо учитывать. Да и то, например, оракловский trunc(a, b) работает как для чисел (b говорит, по какому знаку после запятой обрезать), так и для дат (b говорит, как обрезать дату -- до дня, месяца, года, например). То есть, вывод типов усложняется. Поэтому нафиг оно тебе надо.
[16:24:11] <f[x]> в полном объёме нафиг-нафиг - в ограниченно-разумном с опциональными аннотациями - надо
[16:29:50] <ermine> f[x]: в sqlgg delete вернет число удаленных записей?
[16:32:24] <f[x]> угу
[16:32:37] <f[x]> зависит от бэкенда
[16:33:57] <f[x]> для sqlite3 - нужна свежая версия с sqlite3_changes
[16:35:00] <ermine> ох
[16:35:06] <ermine> окей
[16:35:25] <ermine> у меня и так свежак, но придеццо писать в ридми тогда
[16:35:29] Typhon вышел(а) из комнаты
[16:36:50] <f[x]> э, ну ещё и sqlgg_sqlite3.ml поправь
[16:37:59] <ermine> а там тот же 0L? :)
[16:39:20] <f[x]> наверное
[16:40:43] Typhon вошёл(а) в комнату
[16:44:08] Typhon вышел(а) из комнаты: Replaced by new connection
[16:44:08] Typhon вошёл(а) в комнату
[16:47:38] Typhon вышел(а) из комнаты
[16:52:18] Typhon вошёл(а) в комнату
[16:53:39] geovit вышел(а) из комнаты
[17:13:43] Typhon вышел(а) из комнаты
[17:18:34] Typhon вошёл(а) в комнату
[17:32:57] gds вышел(а) из комнаты
[17:48:44] ygrek вышел(а) из комнаты: Replaced by new connection
[17:48:46] ygrek вошёл(а) в комнату
[18:06:31] <f[x]> http://code.google.com/p/ocaml-patterns/
[18:06:37] <f[x]> тот же автор что и deriving
[18:10:09] gds вошёл(а) в комнату
[18:10:58] <ermine> а что за паттерны?
[18:11:02] <gds> паттерны -- круто.
[18:19:06] iNode вышел(а) из комнаты
[18:48:05] Kakadu вошёл(а) в комнату
[18:49:33] <Kakadu> а эти паттерны как расширение языка стоит воспринимать?
[18:51:20] <f[x]> так и есть
[18:52:19] <f[x]> а например lazy pattern уже есть в самом камле
[18:57:29] Typhon вышел(а) из комнаты
[19:04:41] ermine собрала гвоздями и скрепками полную сульцю
[19:05:05] <ermine> теперь самое противное - выискивать баги, а их наверняка навалом
[19:07:20] <sceptic> напиши бота для тестирования функций sulci :)
[19:11:46] <ermine> а юзеры для чего?
[19:18:49] <sceptic> это медленно и не надёжно
[19:57:45] sceptic вышел(а) из комнаты: Replaced by new connection
[19:57:50] sceptic вошёл(а) в комнату
[20:25:37] gds вышел(а) из комнаты
[20:30:03] iNode вошёл(а) в комнату
[20:49:23] f[x] вышел(а) из комнаты
[21:00:57] Kakadu вышел(а) из комнаты: I'm happy Miranda IM user. Get it at http://miranda-im.org/.
[21:13:51] gds вошёл(а) в комнату
[21:19:21] sceptic вышел(а) из комнаты
[21:36:39] <gds> нашлось случайно: http://son.malanova.ru/wiki/index.php/Caml
[21:37:52] <gds> искалась и нашлась "-curry-constr", но как её врубить в >=3.10 -- не понимаю. видимо, её оторвали.
[21:45:31] DimitryKakadu вошёл(а) в комнату
[21:46:32] DimitryKakadu вышел(а) из комнаты
[21:46:34] Kakadu вошёл(а) в комнату
[21:50:29] <ermine> что ни говори, а красивые решения таки сильно упрощают код
[21:52:31] sceptic вошёл(а) в комнату
[22:07:42] Typhon вошёл(а) в комнату
[23:33:25] Typhon вышел(а) из комнаты
[23:58:13] Kakadu вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!