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

GMT+4
[00:47:12] ermine вышел(а) из комнаты
[00:48:31] digital_curse вышел(а) из комнаты
[00:59:16] gds вышел(а) из комнаты
[01:13:12] ygrek вышел(а) из комнаты
[01:27:37] Kakadu вышел(а) из комнаты
[02:43:10] lelf вышел(а) из комнаты
[07:14:57] iNode вышел(а) из комнаты
[08:26:11] iNode вошёл(а) в комнату
[08:58:19] gds вошёл(а) в комнату
[09:42:10] ermine вошёл(а) в комнату
[10:10:42] serp256 вошёл(а) в комнату
[10:34:45] Typhon вышел(а) из комнаты
[10:54:49] <f[x]> хрррр Fatal error: exception Ctype.Unify(_, _)
[10:55:26] <gds> на каком коде?
[10:56:54] <f[x]> сэмпл отложил, потом будет время минимизирую
[10:57:05] <f[x]> первый раз такое вижу
[11:11:25] ʇsʎɯ вошёл(а) в комнату
[11:23:26] ygrek вошёл(а) в комнату
[11:37:24] npoektop вошёл(а) в комнату
[12:00:46] Kakadu вошёл(а) в комнату
[12:09:58] <gds> а подскажите про терминологию.  circular list -- это список, состоящий только из цикла, а cyclic list -- список, содержащий цикл?
[12:12:18] <f[x]> если разница и есть то очень размытая
[12:15:19] <gds> вот-вот.  Но думаю, как бы правильно обозвать те "улитки", с которыми работаю сейчас (которые можно построить в окамле через let / let rec и которые имеют тип 'a list) -- фактически, списки, состоящие из линейной части, опционально приклеенной к циклу.
[12:16:51] <f[x]> list with cycles
[12:17:01] <f[x]> cyclist :)
[12:19:47] <ʇsʎɯ> listicle
[12:25:22] <gds> в общем, в качестве термина выбрал (по принципу наименьшего удивления) cyclist = cyclic list, а circular list уже будет его подмножеством / уточнением.
[13:25:07] Mon вышел(а) из комнаты
[13:40:02] Mon вошёл(а) в комнату
[14:04:54] sceptic вышел(а) из комнаты
[14:40:39] komar вышел(а) из комнаты: Replaced by new connection
[14:40:49] komar вошёл(а) в комнату
[14:42:26] Kakadu вышел(а) из комнаты
[15:46:09] <gds> интересно, имеет ли смысл сортировка на циклических списках (т.е. обеспечение того, что cmp (hd lst) (hd (tl lst)) <= 0)?  Ведь если цикл содержит отличающиеся (согласно cmp) элементы, циклический список не может быть отсортирован, или результат будет совсем неочевиден (смотря как посмотреть).
[15:50:07] <ʇsʎɯ> ну думаю, что в этом есть смысл
[15:52:45] <gds> если условиться обозначать [a;b;{c;d}] список [a;b;c;d;c;d;..;c;d;..], что должно быть результатом сортировки списка [1;2;{3;4;5}] (упорядочивающая функция -- классическая, Pervasives.compare).
Один из вариантов -- [1;2;{3}], но неочевидно.  Другой вариант -- выдать ошибку на конкретно этом списке.  Третий вариант -- выдавать ошибку вообще на любом циклическом списке.
[16:30:43] <f[x]> имхо логично второе, т.е. чтобы семантика сортированности не менялась от того что это циклический список
[16:31:03] <f[x]> для циклических списко в вакууме
[16:31:37] <ʇsʎɯ> я думаю, что такая извращённая структура как циклический список не претендует на существование в вакууме
[16:34:16] <gds> f[x]: то есть, предлагаешь там, где можно, оставлять циклические списки (с константным относительно cmp циклом), а в остальных случаях давать ошибку?
[16:34:52] <f[x]> без учитывания условий применения (в вакууме) - да
[16:35:02] <f[x]> least surprise
[17:13:18] iNode вышел(а) из комнаты
[17:27:18] yakov вошёл(а) в комнату
[17:27:25] <yakov> hey
[17:27:37] <yakov> я пришел задавать дебильные вопросы ;-/
[17:28:17] <yakov> пишу ocamc -c -I dir foo.ml
[17:28:28] <yakov> в foo.ml тока строка open Bar
[17:28:44] <yakov> в дире dir лежит bar.cmi
[17:28:59] <yakov> и фигли ж мне говорит компилер unbound module Bar?!
[17:29:33] <yakov> единсвенный нюанс что я собираю одной версией а bar.cmi наверное был собран другой..
[17:29:39] <yakov> это важно? ;-)
[17:30:02] <f[x]> cannot reproduce
[17:30:05] <f[x]> да, это важно
[17:30:35] <yakov> ииээхх.. т.е. у меня шансов нет по ходу дела, да?
[17:30:44] <yakov> надо чтоб все одним было собрано, верно?
[17:30:47] <f[x]> да
[17:30:56] <yakov> так и знал :-E
[17:31:38] <f[x]> угу, иногда напрягает, но это обязательная часть bdsml культуры
[17:31:41] gds вышел(а) из комнаты
[17:34:15] <ʇsʎɯ> учитывая фришность компилятора, не вижу смысла заморачиваться на обратной совместимости
[17:36:49] <yakov> при чем тут обратная совместимость?! hint: plugins.
[17:36:53] <f[x]> как фришность компилятора оправдывает форсирование каждого юзера ребилдить все камлолибы при каждом релизе (даже если backward-incompatible изменений и не было (а так обычно и есть для минорных релизов))
[17:37:48] <ʇsʎɯ> а в чём сложнось пересобрать?
[17:38:23] <ʇsʎɯ> и не юзера, а девелопера
[17:38:39] <f[x]> юзер компилятора суть девелопер
[17:40:09] <yakov> myst: я ж те написал-то! дали тебе прогу собранную. к ней плагин те надо собрать!
[17:40:32] <yakov> и те надо подбирать имеено ту версию компилера по хорошему
[17:40:42] <ʇsʎɯ> не надо кричать
[17:40:44] <yakov> или патчить мэджик у модулей.. может быть ;-)
[17:41:00] <f[x]> попробуй меджик патчить, да
[17:41:22] <ʇsʎɯ> а что, исходников проги не дали?
[17:41:23] <f[x]> ударим хекседитором по французскому безпределу
[17:41:29] <yakov> :-D
[17:46:20] <f[x]> * беспределу
[17:48:28] ermine мучается, как бы  на стороне цэ узнать какой был тип у 'a option
[17:48:46] <ermine> никто не подскажет?
[17:50:10] <f[x]> нормальные люди этого хотеть не должны, тип известен в компайл-тайм
[17:52:32] <ermine> ну я же хочу работать с 'a t -> 'a option -> unit -> 'a
[17:53:44] <f[x]> тогда по определению - тип 'a - любой
[17:53:47] ygrek вышел(а) из комнаты
[17:54:04] <f[x]> ты не можешь завязываться на конкретный тип если он полиморфный :)
[17:54:12] <ermine> ну на стороне камла - да
[17:54:15] <yakov> ermine: ты FFI используешь чтоль?
[17:54:20] <ermine> а это external функция
[17:54:34] <ermine> yakov: аштойта?
[17:55:13] <f[x]> ffi = external
[17:55:46] <ermine> ну, уговорили, ффт
[17:55:57] <f[x]> на стороне си тем более - ты же не сможешь обработать _все_ конкретные типы
[17:56:19] <ermine> а проблема в том, что если t - абстрактный тип, то 'a t на стороне цэ не виден
[17:56:27] <ermine> или я не умею
[17:56:39] <f[x]> если у тебя конкретных типов конечное число - используй полиморфные варианты
[17:57:19] <f[x]> хотя нет
[17:57:26] <ermine> f[x]: а как это решает задачу с option?
[17:57:48] <f[x]> нет, тебе наверное gadt'ы нужны но это пусть gds скажет :)
[17:58:35] ermine озирается
[17:59:45] <ermine> та вчерашняя корка, из-за которой я тут мучалась, была как раз из-за того, что я забыла про полиморфизм, и это аукалось при сборке мусора
[17:59:46] <yakov> f[x]: одно через другое не переписывается? ;-)
[18:00:06] <f[x]> может быть подойдёт вариант val create_int : unit -> int t val create_string : unit -> string t etc.. тогда  в этих create повязываешь к t тэг-тип и на сишной стороне его смотришь
[18:00:43] <f[x]> но других способов создать значение типа t не должно быть
[18:02:01] <f[x]> yakov: не
[18:02:29] <yakov> ладно, это был глупый вброс.
[18:03:18] <ermine> f[x]: это приводит к тому, чтобы на стороне С хранить в структуре t подсказку о том, какого типа 'a t
[18:03:34] <ermine> в принципе наверное неплохо..
[18:03:55] <f[x]> да, именно
[18:05:07] <ermine> ладно
[18:05:12] <ermine> пасиб
[18:07:57] Typhon вошёл(а) в комнату
[18:16:36] iNode вошёл(а) в комнату
[18:34:05] gds вошёл(а) в комнату
[18:39:38] <gds> ermine: насчёт gadt -- туплю, не знаю, как это вообще может помочь узнать тип на сишной стороне.  Какие типы в 'a могут быть?  Если конечное их число, нагенери различных функций под различные типы.  Например, так:
type ty = Int | String
type 'a fty = 'a db -> 'a option -> unit -> 'a
let func_int = cfunc Int : int fty
let func_string = cfunc String : string fty
[18:39:50] <gds> cfunc первым аргументом будет получать тип (Int | String)
[18:45:33] <f[x]> так как gadt в камле нет, то никак не поможет :) просто мне кажется проблема подходящая для выражения через gadt
[18:46:38] <ʇsʎɯ> а может просто не надо лезть туда, куда не надо лазить?
[18:57:25] <gds> f[x]: можешь сформулировать проблему так, как ты понял?  А то чото читаю чатлоги и не совсем понимаю.  С другой стороны, gadt реализованы (по запросу "ocaml gadt inurl:okmij" ищется, okmij обязательно!).
[19:13:05] yakov вышел(а) из комнаты
[19:18:45] <ermine> gds: мне хоцца видеть на сишней стороне 'a t, а все остальное хоть умри синим пламенем
[19:19:35] npoektop вышел(а) из комнаты
[19:20:07] ermine пытается пока понять, как перепланировать свою поделку под хранение подсказок о том, какого 'a типа
[19:20:49] <ermine> полиморфизм губителен так же как динамическая типизация, хехе
[19:24:44] <ʇsʎɯ> а зачем знать тип?
[19:27:30] <ermine> чтобы различать
[19:27:52] <ermine> точнее чтобы не иметь дубликаты функций для каждого отдельного типа
[19:28:17] <ermine> щас у меня в биндинге где-то 300 функций апи прибиндичено
[19:28:31] <ʇsʎɯ> ну если тип полиморфичен, то (обычно) это означает, что для функции он не важен
[19:28:40] <ʇsʎɯ> ну я так понимаю
[19:29:04] <ʇsʎɯ> т.е. если f получает 'a list, то ей важно только, что это list, а не какой там 'a
[19:29:05] <ermine> кому он не важен?
[19:29:37] <ermine> на камлевой стороне все видно по 'a t
[19:30:43] <ermine> я щас обдумываю вариант избавиться от 'a t совсем как от неудачного варианта
[19:31:30] <ermine> и пользоваться той же грязной политикой, которая используется в Unix.read
[19:32:27] <ermine> там модификация значений но месту аргумента
[19:32:38] <ʇsʎɯ> а чего именно ты пытаешься достичь?
[19:32:44] <ʇsʎɯ> т.е. что ты делаешь?
[19:32:52] <ʇsʎɯ> может есть способ проще
[19:33:28] serp256 вышел(а) из комнаты
[19:35:35] <ermine> пытаюсь достичь минимальной крови для интерфейса  t -> 'a option -> unit -> 'a, где на стороне С у 'a проверяется Is_long('a) и соответствующим образом идет конвертация камлевого значения в сишнее значение
[19:36:33] <ʇsʎɯ> неет, это КАК ты делаешь
[19:36:40] <ʇsʎɯ> а я хочу понять ЧТО
[19:36:57] <ermine> ты знаешь berkeley db?
[19:37:04] <ermine> его сишнее апи
[19:37:05] <ʇsʎɯ> в общих чертах
[19:37:18] <ermine> там есть DBT структура
[19:37:25] <ʇsʎɯ> угу
[19:37:35] <ermine> для работы с key/data парами баз данных
[19:37:52] <ermine> key в общем случае это recno или маршалированная строка
[19:39:04] <ʇsʎɯ> так
[19:39:52] <ermine> вот щас подумаю и буду типизировать не db, а сам dbt и создавать структуру сразу на стороне камля и лихо использовать функции типа get_int, get_string
[19:40:59] <ermine> и соответственно set_int, set_string
[19:41:05] <ʇsʎɯ> погоди, так основная сложность в том, что key - это или-или?
[19:41:53] <ʇsʎɯ> и у тебя keyval = 'a t от типа ключа?
[19:42:24] <ermine> если иметь функцию val get : key:string -> data:string -> string * string, то как узнать на стороне Цэ, что key надо конвертировать в тип db_recno_t?
[19:43:06] <ermine> get (Marhal.to_string 1) ... например
[19:43:28] <ermine> Marshal
[19:49:55] <ʇsʎɯ> а если type key = Recno | String?
[19:50:15] <ʇsʎɯ> это никак на стороне С проверить нельзя?
[19:54:30] Typhon вышел(а) из комнаты
[19:56:07] <ermine> ʇsʎɯ: можно
[19:56:29] <ermine> ʇsʎɯ: это даже ничем не отличается от просто 'a
[20:06:43] <ʇsʎɯ> ага, т.е. те же грабли
[20:09:55] <ermine> вот сейчас буду играться с таким вариантом:
let key = DBT.create_recno ()
and data = DBT.create_string () in
Db.get key data;
print_endline (DBT.get_string data)
[20:10:05] <ermine> только вот изящно ли это
[20:11:41] <ermine> это не камлевый подход, это тупой сишный подход
[20:12:14] <ʇsʎɯ> ну-ну, сишный подход не такой уж тупой. кое-где он весьма уместен
[20:12:43] <ʇsʎɯ> ну, я тут посоветовать ничего не могу, потому что сам толком не шарю
[20:13:29] ʇsʎɯ вышел(а) из комнаты
[20:13:43] <ermine> тут надо бы использовать "немутабельный подход", т.е. полагать, что никто не изменяет аргументы
[20:14:22] <ermine> хотя наверное поэтому камло успешнее чем хаскиль
[20:14:50] <ermine> gds: а что ты молчишь?
[21:21:40] digital_curse вошёл(а) в комнату
[21:25:18] digital_curse вышел(а) из комнаты
[21:37:50] digital_curse вошёл(а) в комнату
[22:05:44] Kakadu вошёл(а) в комнату
[22:32:46] ygrek вошёл(а) в комнату
[22:53:17] Kakadu вышел(а) из комнаты
[23:05:54] ygrek rants: lj уроды - блокируют доступ через tor _на чтение_
[23:06:37] <olegfink> хттп и знаменит тем, что он чтение от записи плохо отличает
[23:11:58] <ygrek> ээ.. как-бы есть урл
[23:12:44] <olegfink> ну как ты заблокируешь только на запись?
[23:13:21] <olegfink> там вроде как комменты post'ом в lj.com/post/address.html
[23:13:36] <komar> Ну вот.
[23:15:35] <ygrek> т.е. подразумевается случай что блокировка на фронтенде, иначе сам сервер очевидно может определить rea или write
[23:16:21] ermine вышел(а) из комнаты
[23:16:23] <ygrek> но фронтенд то наверняка тоже знает где read и write и так - он для того и существует чтобы read'ы в кэш направлять
[23:16:46] <ygrek> короче я как бы не понимаю абсолютно в чём проблема
[23:32:48] Kakadu вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!