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

GMT+3
[00:09:27] <ermine> оазис собрался
[00:09:38] <ermine> можно считать переезд на 3.12 состоявшимся
[00:20:50] ftrvxmtrx вышел(а) из комнаты
[00:48:47] <ermine> ygrek: когда твой deriving будет компилицо под 3.12?
[00:50:43] <ygrek> я свои патчи отослал jaked, он по идее должен смержить всё
[00:50:49] <ygrek> юзай тот что на гитхабе
[00:51:48] <ermine> я ща пытаюсь его скомпилить
[00:52:16] <ermine> там без твоих патчей хреново :)
[00:58:57] <ygrek> у меня где-то был смерженный вариант если интересно, но я его не проверял в деле ни разу
[00:59:16] <ermine> Fatal error: exception Failure("Ocaml and preprocessor have incompatible versions")
[00:59:23] <ermine> я вот этого не пойму
[01:06:02] <ygrek> чего непонятного? ocamlc -version  и camlp4 -version проверь
[01:07:07] <ermine> оно откуда-то берет -pp deriving, а ктойта это?
[01:07:46] <ygrek> ну для компиляции lib используется вновь собранный deriving, а у тебя видимо берётся старый из PATH ?
[01:07:59] <ermine> ygrek: там везде 3.12
[01:09:03] <ermine> оно при сборке делает ocamldep.dep -pp "deriving " pickle.ml, например и выдает такой экспшн, я пытаюсь понять чо за pp там
[01:09:15] <ygrek> deriving -version
[01:09:29] <ermine> а он у меня есть?
[01:09:36] <ygrek> ну вот и проверь :)
[01:09:42] <ermine> а, точно :)
[01:10:38] <ygrek> от старых сборок остался видимо, т.к. я от отдельного бинарника избавлялся специально - pa_deriving.cma
[01:11:07] <ermine> у меня в $HOME/bin был старый deriving
[01:11:59] <ermine> ygrek: что входило в твои патчи?
[01:12:09] <ermine> enum.ml не выкидывал?
[01:12:54] <ermine> и виимо ты добавил ocamlfind
[01:14:43] <ermine> написать чоль письмо jake, чтобы применил твои патчи
[01:18:42] <ygrek> там в ридми описано - МЕТА, pa_deriving, багфиксы
[01:18:58] ygrek off
[01:19:27] <ermine> ых
[01:19:31] <ermine> ломы мержить
[01:21:49] <ermine> дашь мерж?
[01:25:53] ygrek вышел(а) из комнаты
[01:26:31] <ermine> не дал
[01:30:59] savikov вошёл(а) в комнату
[01:31:34] savikov вышел(а) из комнаты: QIP Infium: Спокойное общение
[01:57:08] abiogenesis вошёл(а) в комнату
[01:57:19] abiogenesis вышел(а) из комнаты
[02:21:48] Typhon вышел(а) из комнаты
[02:31:14] ermine вышел(а) из комнаты
[03:09:25] ftrvxmtrx вошёл(а) в комнату
[07:29:58] komar вышел(а) из комнаты
[08:46:37] gds вошёл(а) в комнату
[10:31:56] Kakadu вошёл(а) в комнату
[10:32:02] ftrvxmtrx вышел(а) из комнаты
[10:56:11] zert вошёл(а) в комнату
[11:58:37] ermine вошёл(а) в комнату
[12:46:34] serp256 вошёл(а) в комнату
[13:12:34] vshender вошёл(а) в комнату
[13:18:32] ygrek вошёл(а) в комнату
[13:33:37] serp256 вышел(а) из комнаты
[13:46:51] Typhon вошёл(а) в комнату
[14:07:55] ftrvxmtrx вошёл(а) в комнату
[14:44:08] ygrek вышел(а) из комнаты: Replaced by new connection
[14:44:10] ygrek вошёл(а) в комнату
[15:00:11] vshender вышел(а) из комнаты
[15:00:13] vshender вошёл(а) в комнату
[15:01:03] vshender вышел(а) из комнаты
[15:01:05] vshender вошёл(а) в комнату
[15:03:53] vshender вышел(а) из комнаты
[15:03:55] vshender вошёл(а) в комнату
[15:32:59] Typhon вышел(а) из комнаты
[15:35:26] vshender вышел(а) из комнаты
[17:29:17] <gds> мелочь, но неприятно: везде использую модуль Ops -- и в ocaml-iteratees, и в проекте, использующем ocaml-iteratees посредством копирования в поддиректорию проекта (и разумеется "-I ocaml-iteratees" для проекта).  Почему так -- потому что 1. лень делать нормальную установку (да и непонятно, что там ставить, в этой ocaml-iteratees), 2. когда в проект включены нераспространённые библиотеки, становится проще его компиляция-установка.  Так вот, ocamlfind ругается: "
findlib: [WARNING] Interface ops.cmi occurs in several directories: ., ocaml-iteratees
"
синхронизирую ops.ml, удостоверюсь, что .cmi одинаковые, на warning забью -- но это в качестве временного решения.  Если будут идеи, что делать в качестве постоянного и негеморройного решения -- давайте идеи.
Например, есть идея переименовать в проекте ops.ml в ops_<projectname>.ml, но кривовато.
[18:28:21] <ermine> gds: а ygrek журит меня за то, что я развожу кучу мелких отдельных библиотек
[18:29:17] <ermine> gds: надо prject_ops.ml :)
[18:29:32] <gds> ermine: ну, ocaml-iteratees ни с чем не сольёшь, поэтому тут жури - не жури, один хрен, отдельная библиотека.
[18:31:29] ermine вяло ползает по "фтп" олега киселева среди статей про first class modules и про принтфы
[18:32:33] <ermine> великие умы не подумали о том, что хочется в рантайме выбирать тот или иной модуль, а не на этапе компиляции
[18:36:59] <gds> даже в старых окамлах есть решение: обернуть всё, что зависит от выбираемого модуля, в функтор, которому давать в параметрах выбираемый модуль, и далее (if ... then let module Q = Functor(Module1) in Q.main else let module Q = Functor(Module2) in Q.main) ().
[18:37:19] <gds> вроде с first class modules даже этого не надо делать.
[18:39:45] <ermine> gds: не, скажем, module Ru = struct let hello = "привет" end
module En = struct let hello = "hello" end
[18:40:17] <ermine> gds: скажем, на этапе компиляции я могу сгенерить вот такие модули из какого-то текстового файла переводов
[18:40:21] <ermine> а что дальше?
[18:42:21] <gds> module Main (Lang) = struct
...код, зависящий от языка...
let main () = ...
end
let real_main () =
  (if Sys.getnev "LANG" = "ru_RU..." then let module Q = Main(Ru) in Q.main else let module Q = Main(En) in Q.main) ()
[18:42:25] <ermine> возможно это плохой вариант type-safe форматных строк
[18:42:58] <ermine> у тебя одноязычный софт получается
[18:43:12] <gds> почему?
[18:43:48] <ermine> потому что язык выбирается скажем по Language-Accept в http заголовке, например
[18:44:19] <gds> ну, переведи построение модуля из функтора в то место, где становится известным язык.
[18:44:27] <gds> конечно, элегантность потрясающая -- везде, где нужен "перевод", требуется оборачивать кодэ в функтор.  Поэтому -- читай про first class modules, может что получится более прямым образом.
[18:45:55] <ermine> ну встраивать код на этапе компиляции легко
[18:46:31] <ermine> главное чтобы не было все слишком жестко - хочется dynlinkом подгружать модули же и как-то аттачить их
[18:47:29] <ermine> я уже все этапы извращения обдумала, теперь вот осталось только это - как аттачить и вытаскивать нужную функцию из модуля, в которой дофига форматных строк на все случаи жизни, но на одном языке
[18:48:10] <ermine> gds: с классами и рекордами все проще, их можно аттачить
[18:48:30] <ermine> зато элегатность намного менее потрясающая
[18:49:55] <gds> ну не знаю -- что класс/запись таскать, что в функтор оборачивать.
а может препроцессором что-нибудь делать?
[18:50:33] <ermine> кстати module Main (Lang) ... тоже вставляет, поскольку невозможно на этапе рантайма сгенерить функцию из какого-то описания с заданной сигнатурой
[18:51:28] <ermine> препроцессор ведь не кашляет в рантайме
[18:53:42] <ermine> gds: сведем задачу к другой задаче, которую я уже отбросила: как из [String "abc"; Int] сгенерить функцию val hello : string -> int -> string в рантайме?
[18:54:07] <ermine> или чота вместо списка подойдет, список-то можно засунуть в хэштаблицу
[18:54:37] <ermine> вот кстати про генерацию - это наверное про gadt больше похоже
[18:54:58] <gds> а откуда берётся [String "abc"; Int] ?
[18:55:44] <ermine> gds: сгенерила из файла переводов, в котором пишем "abc %d", скажем так
[18:56:08] <ermine> gds: я же хочу type-safe format
[18:56:45] <gds> тогда можно там же сгенерить и функцию соответствующую?  которая val hello : int -> string или как там.
[18:57:31] <ermine> gds: да, так мы пришли к задаче, про которую я ною выше
[18:57:56] <ermine> gds: это как раз module Ru ... end
[18:58:21] <ermine> gds: или ты о другом подумал?
[18:59:20] <ermine> gds: а динамически подгружаемый код вынужден регистрировать свои функции куда-нить, иначе до них не дотянешься
[18:59:46] <ermine> функции в хэштаблицу не засунешь
[19:00:18] <ermine> решение в лоб - в том же модуле сделать рекорд со всеми полями-функциями
[19:00:40] <ermine> или вместо модуля юзать объект класса
[19:00:53] <ermine> а есть другие варианты?
[19:05:12] <ygrek> gds: не делай install для ops.cmi - это же внутренний модуль?
[19:05:34] <gds> ermine: решение с функтором рассказал.  с объектом-записью -- знаешь уже.  по-любому, как-то надо передавать коду язык, который будет использоваться.  решай, как передавать.
[19:06:07] <gds> ygrek: сейчас вообще ничего не install'ится -- просто положил в поддиректорию ocaml-iteratees и указываю -I поддиректория.
[19:07:49] <ygrek> gds: ну тогда делай ops "нормальной" либой "имени себя"
[19:09:46] <ermine> gds: надо еще подвигать извилинами :)
[19:13:31] ermine щупает gadt
[19:13:40] <gds> ygrek: да не стоит оно того, чтобы либу оформлять и иметь её как отдельную сущность.  В общем, пока переименовывать буду, а там поглядим.
[19:13:57] <ermine> хотя непонятно, будет ли оно уже работать или надо ждать следующей версии камля
[19:14:10] arhibot вошёл(а) в комнату
[19:15:13] <ermine> таки следующей версии
[19:15:16] <ermine> ацтой
[19:56:48] arhibot вышел(а) из комнаты
[19:56:50] arhibot вошёл(а) в комнату
[19:58:02] arhibot вышел(а) из комнаты: Replaced by new connection
[19:58:03] arhibot вошёл(а) в комнату
[20:01:58] arhibot вышел(а) из комнаты
[20:02:00] arhibot вошёл(а) в комнату
[20:03:11] arhibot вышел(а) из комнаты
[20:03:13] arhibot вошёл(а) в комнату
[20:04:12] arhibot вышел(а) из комнаты: Replaced by new connection
[20:04:14] arhibot вошёл(а) в комнату
[20:28:28] arhibot вышел(а) из комнаты
[20:28:31] arhibot вошёл(а) в комнату
[20:39:23] ftrvxmtrx вышел(а) из комнаты
[21:06:10] <ermine> gds: я пока решила, что буду втыкать во все места, где нужны переводы, свои хэштаблички, ибо можно извратиться и сгенерить функции, которые добавляют в нужное место то что надо
[21:06:23] <ermine> gds: это ничего так?
[21:14:58] <gds> ermine: а не знаю.  В хештабличках что будет (какие ключи/значения)?
[21:15:55] <ermine> gds: ("ru", (string -> int -> string) Hashtbl.t
[21:16:20] <ermine> gds: у тебя выше в твоем примере кода было if lang = "ru" then ...
[21:16:39] <ermine> ну вместо if просто дергаем табличку
[21:17:22] <ermine> только вот этих табличек буде дофига, на каждый тип формата
[21:18:20] <ermine> зато это гибче чем засовывать в рекорд - если какого-то перевода нет, то фиг с ним, не сломается
[21:20:43] <ermine> gds: пример перевода (точнее куда он втыкатся): "Login" <input type='text'>, надо переводить сам "Login", вот тут будет вытаскивание перевода из локальной таблички
[21:28:34] <gds> ermine: всё понял, но пока тупка у меня -- ничего умнее, чем ты описала, не придумывается.  Есть идеи с gadts, да даже так, что со старым окамлом сработает.
[21:42:36] ermine читает вдоль и поперек и рядом с http://okmij.org/ftp/ML/first-class-modules/
[22:32:59] <gds> ermine: в общем, вывод такой: если хочешь хеш-таблицу одну, готовься в рантайме проверять типы (что не сложно, но ошибконезащищённо).  Если много -- хоть нарожай функций с типом
value si_ : translation -> string -> int -> string
value i_ : translation -> int -> string
но это если типы "конкретные" -- string, int, bool, float.  Для фокусов типа %a, %t -- сложнее уже, но тоже делается.  Например, если сделать объект и
method si : string -> int -> string;
method i : string -> int -> string;
method sai : !'a. string -> ('a -> string) -> 'a -> int -> string;
правда вот сходу не скажу, будет ли точно работать.
И, если так идёшь, готовься при написании исходников указывать типы (в виде указания названий методов).
Или указываешь типы и значения (которые "свидетели" типов -- как методы si/i/sai) и ловишь ошибки компиляции, или "тегируешь" значения и ловишь ошибки типизации в рантайме.
[22:33:18] ftrvxmtrx вошёл(а) в комнату
[22:35:15] <gds> тьфуты,
method i : int -> string;
[22:41:11] Typhon вошёл(а) в комнату
[22:47:34] <ermine> gds: c типами у меня идея немного другая уже
[22:47:52] Kakadu вышел(а) из комнаты
[22:51:20] <ermine> gds: я хочу не %d, %s, а $name, $year, и $({year, month, day}, uptime), где uptime - это функция, принимающая три аргумента типа int и возвращающая string, что позволит мне корректно выводить аптайм вида "2 года, 3 месяца и 31 день", эту интересную часть я уже продумала и тут вопросов особых нет, а вообще мучаюсь скорее тем как аттачить (пошарить в модуле и найти) функции
[22:51:48] <ermine> да и имена переменных дают возможность переставлять их местами
[22:52:08] <ermine> это имхо интереснее чем тупое %s %d
[22:53:24] <ermine> вот только мне чота не нравятся всякие тупые идеи регистрации функций
[22:54:14] <gds> кстати, labelled arguments имхо тут рулить будут.  и можно в типизированное камло засунуть всякие проверки типов.
[22:55:03] <gds> понятно, что я "не про то".  (но ведь и не должен?  это же интернет?..)
[22:55:16] <ermine> и проверка типов, и проверка наличия самих аргументов
[22:56:00] <ermine> да можно бормотать что угодно
[22:56:06] <ermine> авось что-то набормочется еще
[22:57:55] <ermine> еще надо не забывать, что сгенерить любой код можно с помощью camlp4, у меня вопрос лишь в том, что именно надо сгенерить, чтобы не было слишком жестко вида if lang = "ru" then ...
[22:58:57] <ermine> остальную работу по проверке типов сделает сам компилятор
[22:59:54] <ermine> надо почитать ту статью про объекты у jake, мож там чота есть
[23:03:39] <gds> jake писал про объекты вроде только в плане их низкоуровневого устройства.  Думаю, это не нужно -- лучше честно нагенерить через camlp4, без "runtime introspection"/"reflection".  Ясное дело, что генерить надо не дубовые "if lang=...", но тут тебе виднее.  Можно в целом грузить модули-как-значения, можно хеш-таблицы и проверять типы.  Можно existential types подключить в рассмотрение.  Изучай.  Ведь хочешь няшечку на выходе?  Тогда надо подумать.
[23:05:15] <ermine> не, я не собираюсь на низком уровне что-то делать
[23:05:21] <ermine> я вообще про архитектуру
[23:08:03] <ermine> gds: ты-то сам дописал свою няшечку с документоделалкой?
[23:11:35] <gds> не, я же лох :)  Подкинули других дел, немалая часть из которых тоже не реализована.  Но подкидывают за деньги, так что я не противлюсь.  А учитывая, что есть и ещё работа (fulltime), три работы вместе я ниасиливаю.  Даже бухло/вещества не помогают (по крайней мере, доступные у нас; наверное, всякие амфивитамины(tm) помогли бы, да нету).
[23:12:35] <zert> от веществ в дальнейшей перспективе будет очень плохо
[23:12:41] <zert> от работы есть смысл отказываться
[23:12:55] <zert> иначе рискуешь по всем фронтам накосячить и сроки сорвать
[23:13:00] <zert> репутацию подпортишь
[23:13:26] <zert> я вот отказываюсь и не ослеп
[23:13:31] <zert> говорю, что не могу
[23:15:26] <ermine> zert: любая работа делается, чтобы покупать вещества
[23:15:51] <Typhon> чтобы можно было делать больше работы
[23:16:30] <gds> zert: так таки да, вещества не пользую (кроме алкоголя/кофеина), пока выбираю стабильную работу среди двух имеющихся (одна точно стабильная, другая на 1k$ больше, и, вероятно, таки стабильная, и там функциональщина), и задвинул хобби нафиг куда подальше.  Последнее, что делал -- earley parser, не доделал.  Ну, вы все видели этот фейл.
[23:17:27] ygrek ковыряет savonet
[23:17:33] <gds> zert: так вот, прикол в том, что со стабильной работы бабло не капает, а если на нестабильную свалить, вероятно жопа будет.  Так-то!
[23:17:35] <gds> ermine, Typhon, вы жжоте :)
[23:17:57] <gds> ygrek: за бобло?
[23:18:05] <zert> вероятно
[23:18:11] <zert> я тоже так думал, когда сваливал
[23:18:21] <ygrek> не, за идею
[23:23:54] <ermine> у jake объекты превращаются как раз в рекорды с полями-функциями
[23:24:04] <ermine> немного скучновато
[23:24:38] Typhon вышел(а) из комнаты
[23:25:37] <ermine> а нет, не совсем так
[23:25:48] <gds> zert: пока проще две работы с задвинутыми куда подальше хобби, нежели нестабильность.  Кому-то везёт, кому-то нет.  Я всегда хотел в дворники пойти на месяц-другой, но тут холодно пока, поэтому воздержусь.
[23:25:51] <gds> ygrek: за идею -- это хорошо, если бобло есть.  Тоже был бы не прочь, однако, не факт, что именно savonet.
[23:28:29] <ermine> gds: приезжай на зиму в Москву, тут снега навалом, а чистить некому
[23:38:51] <gds> ermine: если уж в Моркву, то там есть гораздо более кошерная работа.  Более того, если хоть куда-нибудь ехать, то есть ещё более кошерные варианты.  Проблема в том, что ехать никуда не хочется.
[23:40:29] <gds> что-то оффтопик развожу.  Это не совсем правильно.  Пойду iteratees трогать на практике.  А вам всем -- чмоке.
[23:41:27] ermine заглянула в oo.ml и разочаровалась
[23:45:59] Kakadu вошёл(а) в комнату
[23:46:02] Kakadu вышел(а) из комнаты
[23:52:38] arhibot вышел(а) из комнаты: Replaced by new connection
[23:52:39] arhibot вошёл(а) в комнату
[23:56:35] zert вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!