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

GMT+4
[01:57:52] gds вышел(а) из комнаты
[07:19:17] john вошёл(а) в комнату
[09:25:27] Typhon вошёл(а) в комнату
[09:51:39] sevenov вышел(а) из комнаты
[09:53:02] sevenov вошёл(а) в комнату
[10:32:15] ygrek вошёл(а) в комнату
[10:38:08] Mon вошёл(а) в комнату
[10:57:26] animist вышел(а) из комнаты: Replaced by new connection
[10:57:29] animist вошёл(а) в комнату
[11:04:10] f[x] вошёл(а) в комнату
[12:01:12] gds вошёл(а) в комнату
[12:18:47] ygrek вышел(а) из комнаты
[13:12:31] animist вышел(а) из комнаты: Replaced by new connection
[13:12:34] animist вошёл(а) в комнату
[13:20:59] animist вышел(а) из комнаты: Replaced by new connection
[13:21:03] animist вошёл(а) в комнату
[13:28:20] animist вышел(а) из комнаты: Replaced by new connection
[13:28:22] animist вошёл(а) в комнату
[13:30:15] <gds> окамловский репозиторий переехал cvs -> svn. Делаем ставки, лет через 10 они выберут bzr или peforce?
[13:31:14] <f[x]> что-то они спешат, спешат.
[13:37:29] <ermine> странно пчу хотят централиованный vcs
[13:38:21] <ermine> с другой стороны git не особо лучше svn, местами даже хуже
[13:40:31] <ermine> еще удивительнее, что не darcs
[13:40:32] <f[x]> Учитывая сколько у них там разных веток/форков, я вообще удивляюсь как они в cvs жили. Я пару раз в cvs мержился, это достаточно кропотливый процесс, отвлекаться нельзя
[13:41:26] <ermine> имхо в гите с бранчами номано, я уже опробовала
[13:42:32] <ermine> вот в дарксе бранчей нет, наверное поэтому отвергли :)
[13:43:10] <gds> да везде, кроме cvs, в принципе можно жить. Интересно вот, почему именно свин.
(почему не darcs, лично мне понятно)
[13:43:20] ermine пошла мучаться с хранением глобальных переменных в сульце
[13:44:23] <ermine> gds: в свине нет только децентрализованности, все остальное на ура работает
[13:45:45] <f[x]> ну бранчи тяжёлые, не знаю как с merge'м (в 1.6 вроде что-то улучшали)
[13:48:14] <ermine> я в гите иногда применяю такую схему: чтобы сделать мелкий функционал в своей проге - создаю бранч, делаю функционал, если всё ок, то либо мержить с мастером, либо вообще удалить мастера и переименовать бранча в мастер
[13:48:57] <ermine> страншно подумать, как это выглядело бы в рисунках графов
[13:50:04] <f[x]> ermine: угу, feature branch, реально удобная вешь, попробуй проделай такое же в svn, и не для одной а для нескольких "фич"
[13:50:21] <f[x]> ы?
- Explicit naming of a generic type; in an expression like "fun ... (type t) ... -> e",
the type t is considered abstract in its scope (the arguments that follow it and the body
of the function), and then replaced by a fresh type variable. In particular, the type t
can be used in contexts where a type variable is not allowed (e.g. for defining
an exception in a local module).
[13:51:27] <gds> откуда ты это цитируешь?
[13:52:11] <ermine> много букв
[13:53:15] <ermine> но самая первая фраза интересна
[13:53:41] <f[x]> changes
[13:53:42] <gds> и одного описания мало.
[13:54:24] sceptic вышел(а) из комнаты
[13:56:57] <f[x]> если б я сам знал что это такое :)
[13:58:16] sceptic вошёл(а) в комнату
[13:59:50] <ermine> fun ...(type t) .. -> e
[14:00:01] <ermine> а чо, теперь можно такой синтаксис?
[14:00:36] <ermine> писать type t внутри аргументов
[14:01:53] <ermine> f[x]: непонятно что sqlgg делает, если в test.sql забыть завершить строку точкой с запятой
[14:02:15] <ermine> f[x]: а зачем вообще нужна точка с запятой?
[14:05:42] <f[x]> ничего не будет делать, надо чтобы ошибку показывал
[14:06:15] <f[x]> разделитель, иначе парсер с ума будет сходить на кривых запросах
[14:06:41] <f[x]> а так плохой запрос пропускается (с ошибкой) и работаем дальше
[14:06:46] <ermine> а в test.sql можно засунуть запрос с begin .. end?
[14:07:01] <ermine> begin .. commit
[14:07:46] <f[x]> пока нет
[14:08:43] <gds> чую, новую штуку делают для того, чтобы объявления наподобие
let (polyfun : 'a -> 'a) = fun x -> x + 1;;
наконец-то можно было написать так, чтобы тайпчекер ограничивал не сверху, а снизу (т.е. давал гарантии, что для любого 'a функция будет работать, а не как в хиндли-милнере.
[14:08:44] <f[x]> учитывая crap-статус - я добавляю sql конструкции по мере надобности
[14:09:48] <f[x]> gds: подбираются к existential'ам что-ли?
[14:11:50] <ermine> f[x]: да ладно, мне commit блоки пока что и не нужны, это просто следствие отсутствие документации в sqlgg
[14:13:07] <gds> если и да, то как-то сбоку. риальные герои всегда идут в обход. а может это я думаю, что в обход. в общем, нужна толковая документация. и таки релиз 3.12.
а вот синтаксис паттерн-матчинга записей -- это твёрдый зачот.
[14:13:53] animist вышел(а) из комнаты: Replaced by new connection
[14:13:57] animist вошёл(а) в комнату
[14:14:22] <f[x]> ermine: режешь по живому
[14:15:27] <gds> ermine: а где документация на sulci?
[14:17:39] <f[x]> о!
[14:18:01] <ermine> gds: а ее не используют как компонент в другом софте
[14:18:32] f[x] периодически наблюдает "пользователей" сульци жалобно ищущих репу :)
[14:18:47] <ermine> gds: заведу какнить на вики сумбурное описалово
[14:19:15] <ermine> ага
[14:19:17] <gds> дада, вот я тоже видел, что народ в непонятках.
[14:19:29] <ermine> теперь намучаются со сборкой sqlgg, хи-хи
[14:21:05] <ermine> там в extlib было что-то для стораджа глобальных переменных?
[14:25:05] <ermine> ладно, буду юзать хэштаблы
[14:26:08] <ermine> неудобство в том, что добавляемые плагины сульци не могут добавить свои глобальные переменные куда-нить в общий сторадж
[14:26:27] <ermine> типизация мешает
[14:28:09] <gds> типизацию можно и забороть в данном случае. existential types, yo!
[14:28:37] <sceptic> кстати, насчёт фреймворка. он на REST будет основан?
[14:32:22] <gds> REST -- ?
[14:32:55] <gds> ermine: опищщи, что плагин должен уметь от глобальных переменных.
[14:34:28] <sceptic> http://en.wikipedia.org/wiki/Representational_State_Transfer
[14:37:41] <sceptic> http://archimag-dev.blogspot.com/search/label/REST
[14:40:08] <gds> не понял, что такое REST. точнее, буквы и слова знакомые, но это или слишком очевидно, или же наоборот, понятие в стиле "веб 2.0" или кучи других маркетоложеских терминов, которое никто не может объяснить.
[14:43:26] <sceptic> второе глянь
[14:46:15] <gds> уже. ну, компоненты публикуют урл в качестве апи, и всё?
[14:46:42] <ermine> rest - это json сейчас
[14:47:24] <ermine> gds: в конкретном случае - хранить хэндл файла, как обычно, не покатит хранить внутри функции с партиал аппликешнем
[14:48:07] <ermine> gds: и можно сделать зависимым от сессии
[14:48:33] <ermine> gds: получается - надо создавать внутри плагина хэштаблицу с ключами - ключами сессий
[14:49:27] <ermine> внутри каждого плагина
[14:50:28] <gds> почему хранить в closure не покатит?
[14:50:43] <ermine> и вообще еще много чего не придумала, например, хочу привязать к каждой конфе свой список фич
[14:51:34] <ermine> gds: некуда сувать, нет такой клозы
[14:52:33] <ermine> gds: точнее клозы есть, но доступ нужен и снаружи
[14:53:33] <gds> снаружи -- это как?
[14:54:10] <ermine> клозы работают с сессией и вызываются когда приходит пакет из сокета
[14:54:31] <ermine> если же юзер в консоли хочет чтонить добавить в файл - ему надо достать файл откуда-нибудь
[14:56:08] <gds> хранить хендл в двух closures:
let (fun1, fun2) = let fd = open_file .. in ( fun .. -> .. , fun .. -> .. )
дело в том, что идеи есть, но сначала нужно понять, что же точно тебе нужно.
[14:56:18] <ermine> в общем, многосессийонный случай - в клиентах джаббера всегда был нетривиальным
[14:58:12] <ermine> gds: вредно все хранить в клозах, это мы на примере ejabberd уже убедились
[14:59:21] <gds> я не убеждался. почему вредно?
[15:00:25] <ermine> gds: не все живут внутри scope клоз
[15:01:13] <ermine> gds: сделай функцию let get_file (), которая будет приставать к клозе с просьбой отдать хэндл файла
[15:02:40] <gds> можно, но некрасиво получится.
но переменные тебе нужны session-specific?
нужно get/set их, а ещё?
[15:04:51] <ermine> а обычный сторадж вроде умеет только get/set
[15:05:09] <ermine> беда только в том, что переменные разных типов
[15:08:19] <gds> задачу понял, решение думаю.
[15:09:00] <ermine> ну так ведь в лоб - хэштаблицы внутри плагинов
[15:09:20] <ermine> в принципе оно ничего так
[15:15:15] <f[x]> > теперь намучаются со сборкой sqlgg, хи-хи
кстати, можно коммитить сгенеренный код, я так на работе делаю
[15:16:22] <ermine> да я вчера ужо коммитила сгенеренный код
[15:56:08] george.kalikhman вошёл(а) в комнату
[16:08:59] john вышел(а) из комнаты
[16:09:01] john вошёл(а) в комнату
[16:10:09] john вышел(а) из комнаты
[16:16:36] <gds> ermine: можно сделать type-safe решение, но потребуется Obj в имплементации (зато без Obj при использовании).
[16:26:09] <gds> а хотя ошибки типизации будут ловиться только в рантайме (ровно в том месте, где используют значение с неправильным типом), а не статически, поэтому не знаю, насколько это приемлемо. Если аккуратно писать код и если типов не много, то это не страшно.
[16:31:10] <gds> пожалуй, по-любому, хотя бы для себя набросаю я эту штуку :)
[16:43:30] <ermine> gds: такая штука хороша для софта типа memcached
[17:00:20] george.kalikhman вышел(а) из комнаты
[17:18:53] <gds> http://paste.defun.ru/m4a0596e7
[17:19:26] <gds> пацан сказал -- пацан сделал.
[17:20:47] <ermine> надо сделать свой окамлевый паст
[17:20:51] <gds> и, конечно же,
value v_wrong = var tyint False;
выдаёт ошибку при компиляции:
File "dyntest.ml", line 47, characters 26-31:
Error: This expression has type bool but an expression was expected of type
int
[17:22:01] <ermine> знаешь, для динамических типов уже придумали json
[17:22:55] <ermine> и хорошо, что любой кастомный тип состоит из базовых типов
[17:23:39] <gds> там можно запихать разнотипные значения в список?
[17:24:34] <ermine> ну String "string" и Int 1 - можно
[17:25:03] <ermine> хуже с file_descr, я пока не понимаю что делать с абстрактными типами
[17:25:19] <gds> вот-вот, так и думал.
[17:26:42] <ermine> жизнь - штука непростая
[17:26:58] <gds> моё решение работает независимо от конкретных типов и не требует поддержки со стороны хранилища (как в твоём случае с хеш-таблицей). достаточно того, что вызывающий будет использовать значение ровно с тем типом, с которым он его закатал в "переменную".
[17:28:47] <ermine> надо изучить опыт мастистых мацанов
[17:29:37] <gds> а чо тут изучать -- динамическая типизация она и в африке динамическая типизация.
[17:30:16] gds вышел(а) из комнаты
[17:30:20] <ermine> где dynvar.ml?
[17:32:10] <sceptic> в codepad.org есть подцветка для камал, и в dumpz.ru
[17:32:22] <sceptic> а, последнее не то
[17:33:05] <ermine> sceptic: для ревизеда?
[17:33:09] <sceptic> dumpz.org
[17:33:30] <sceptic> мм.. вот это без понятия.
[17:33:41] <sceptic> но вообще да. нужен собственный паст.
[17:33:52] <ermine> так что если делать верблюда, то делать верблюда
[17:34:38] john вошёл(а) в комнату
[18:08:49] gds вошёл(а) в комнату
[18:10:35] <gds> dynvar.ml выложу. пока не знаю, куда лучше. модуль как обычно мелкий, недоказанный, противоречащий всему окамлу сразу, поэтому хз, надо ли на форж его.
и, кстати, надо бы убедиться, что я не изобрёл велосипед. вроде чото было про динамическую типизацию (в рассылке или на форже, не помню).
[18:20:11] <gds> ещё бы, кстати, убедиться бы в безопасности -- а то Obj это хорошо, но опасно.
[18:52:58] <gds> вот где я видел: http://okmij.org/ftp/ML/#dynvar
но там другое. а называть проект ocaml-dynvar -- признак неуважения к господину киселёву. какие варианты названия есть?
[18:53:26] <Typhon> DYNozaVar
[18:53:30] <Typhon> ^^
[18:53:37] <gds> страшно!
[18:56:03] <gds> как и "DYNAmically Typed VARiables" ("DYNATVARь")
[18:58:18] <gds> хотя пофиг, не невесту выбираем. ocaml-dynatvar. скоро выложу.
[18:58:55] <gds> с другой стороны, есть это: http://janestcapital.com/?q=node/18
[19:00:59] <Typhon> dvar ?
[19:09:04] <gds> а, уже создал так.
[19:09:07] <gds> ermine: hg clone http://bitbucket.org/gds/ocaml-dynatvar/ ocaml-dynatvar
[19:10:25] <ermine> у меня нету hg
[19:10:30] <ermine> ыы
[19:10:56] <ermine> свин есть, даркс есть, гит есть, цвс даже есть
[19:11:17] <gds> http://bitbucket.org/gds/ocaml-dynatvar/src/tip/dynvar.ml
http://bitbucket.org/gds/ocaml-dynatvar/src/tip/dynvar.mli
[19:13:04] <ermine> насчет опасности - на практике узнае
[19:13:06] <ermine> м
[19:13:34] <ermine> блин
[19:13:45] <ermine> это не исходники, а хтмл?
[19:13:58] <ermine> а я как дура, в вгет зарядила
[19:14:21] <gds> http://bitbucket.org/gds/ocaml-dynatvar/raw/5d91122a8a7b/dynvar.ml
http://bitbucket.org/gds/ocaml-dynatvar/raw/5d91122a8a7b/dynvar.mli
[19:14:27] <gds> вот файлы с исходниками
[19:15:15] <ermine> вот теперь файлы
[19:16:44] <ermine> camlp4rf рулит
[19:16:57] <gds> и заметка: свидетелей лучше создавать как top-level module values, так как не знаю, к чему приведёт создание их как локальных значений. по идее, максимум что будет, это засрётся память, но всё же.
[19:17:17] <gds> _tags рулит ещё больше.
[19:17:45] <f[x]> в чём разница? r и rf?
[19:18:37] <ermine> а читать-то предпочту в родном синтаксисе
[19:21:30] <ermine> а можно ли модифицировать то, что сохраняется в хранилище? скажем, засуну я туда Map.t
[19:22:03] <ermine> ну Map - не помодифицируешь, пожалуй
[19:22:20] <ermine> а что с ним делать? каждый раз создавать новую переменную?
[19:22:48] <ermine> хэштаблицу можно безопасно модифицировать?
[19:22:56] <f[x]> ref :)
[19:23:03] <gds> сходу думаю, что ref модифицировать -- будет без проблем. да, каждый раз var_ref := var ty new_val
[19:23:43] <gds> мог добавить какой-нибудь update для ссылок.
[19:24:18] <gds> сходу прикидываю, что и с хеш-таблицами будет всё ок.
[19:24:32] <ermine> а сам сторадж где?
[19:24:44] <ermine> могу я привязать сторадж к ключу сессии?
[19:24:52] <gds> где захочешь Dynvar.var хранить, там и будет.
[19:25:02] <ermine> или вообще запихнуть туда, где щас дерюу ключ сессии
[19:25:10] <gds> то есть, я завернул всё в тип var, а там уже клиент разберётся, что он хочет.
[19:26:02] ermine - тупой клиент
[19:26:04] <gds> типизация по "свидетелю" гарантирует корректность и, как максимум, бросает Dynvar.Type_error.
[19:26:44] <gds> погляди в http://bitbucket.org/gds/ocaml-dynatvar/src/tip/dyntest.ml (это хтмл), там просто.
[19:28:16] <ermine> эх, распыляют по всему тырнету вместо камлюнити
[19:29:55] <gds> у тебя нет хостинга hg, а учитывая твою ненависть к меркуриалу, даже и просить не стал. У себя поднимать пока мало смысла.
Если чо, перенесём.
[19:29:55] f[x] с вызовом: а ты написал(а) cms/forge/wiki на камле?
[19:30:32] ermine пока одного не поняла
[19:32:32] <ermine> gds: я попросту говоря не вижу "сторадж" в этом примере и сам пример, где сторадж создается сначала и хранится гдето, а ты потом туда добавляешь новый тип
[19:33:10] <sceptic> hgweb лекго поднимается
[19:33:52] ermine ненавидит не меркуриал, а питон
[19:33:58] <ermine> особенно на сайте
[19:34:02] <gds> в примере vlist видишь? вот это storage.
[19:34:17] <ermine> вижу
[19:34:32] <ermine> я vlist пишу в структуру сессии, ага?
[19:34:44] <ermine> в виде списка?
[19:34:52] <ermine> пустого для начала
[19:36:01] <gds> не обязательно. смотри, с помощью этого модуля можно любое значение завернуть в мономорфный тип Dynvar.var, а там уже с этим мономорфным -- хоть что делай. Хоть в запись пихай, хоть в список складывай, хоть хеш-таблицу Hashtbl.t key_type Dynvar.var делай, хоть Map.
[19:36:22] <gds> но с Map кстати я погорячился. сравнивалку не напишешь :)
[19:36:47] <gds> то есть, в качестве ключа такое значение не используешь.
[19:38:40] ermine хмыкает
[19:52:25] <ermine> надо в общем создать крутой сторадж для вообще всех глобальных меременных
[19:53:37] <ermine> а пчу эту методику еще не применяют широко?
[19:54:28] <gds> я бы к сессии привязывал, видимо, хотя не знаю твоей специфики. типа, сессия сдохла -- делаем тотальный абырвалг всем её данным.
[19:55:39] <gds> методика называется "динамическая типизация". в общем, это поганая такая методика :) к счастью, на моих задачах она редко нужна. (раз уж до этого момента не удосужился написать. хотя подобные вещи для других целей уже делал)
[19:57:06] <gds> нет проверки типов со стороны компилятора, например.
Кстати, когда dyntest.ml писал, сам нарвался -- изначально у меня было
value v2 = var mystring 123 (копипаста, да)
, и тип свидетеля mystring мономорфизировался до ty int, а потом я ловил ололо на printf'е.
[19:57:58] <gds> (повезло, что статически ловил, так как лажа была в var. Будь дело в get, наслаждался бы фейлом в рантайме.)
[20:01:00] <gds> и вообще, рекомендую такие переменные только в случаях необходимости. Например, плагины, пишущие в общий session storage, можно отнести к такому случаю. И даже можно для каждого плагина создать одну запись с session-specific данными и зарегистрировать ровно один тип, чтобы была гарантия того, что в get не будет приколюшечек.
[20:06:57] f[x] вышел(а) из комнаты
[20:21:42] <ermine> gds: после последнего рефакторинга в сульце практически все стало плагином, голый сульци может только залогиниться в джаббер и всё, поскольку это умеет сама библиотека, а все остальные фичи - плагины, которых либо статически либо динамически можно компилить
[20:22:08] <ermine> жалко что плагин не выгрузишь
[20:23:38] <gds> что не выгрузишь -- мелочи.
[20:24:20] <ermine> это немного смазывает прелесть динамической загрузки
[20:28:26] gds думает о смазанных прелестях.
[20:29:21] <ermine> чьих?
[20:29:38] Typhon вышел(а) из комнаты: Replaced by new connection
[20:29:38] Typhon вошёл(а) в комнату
[20:45:29] aloner2k вышел(а) из комнаты
[20:48:56] Typhon вышел(а) из комнаты
[21:06:25] sceptic вышел(а) из комнаты
[21:11:54] sceptic вошёл(а) в комнату
[21:17:57] john вышел(а) из комнаты
[21:49:54] Typhon вошёл(а) в комнату
[22:04:59] <sceptic> А camlp4 и campl5 параллельно существуют?
[22:05:41] <gds> да
[22:06:13] <sceptic> А в чём принципиальное отличие?
[22:06:35] <gds> old camlp4 @ 3.09 -> { new camlp4 @ 3.10 + camlp5 отдельно }
camlp5 совместим со старым camlp4
[22:06:49] ygrek вошёл(а) в комнату
[22:07:04] ygrek вышел(а) из комнаты
[22:07:33] ygrek вошёл(а) в комнату
[22:16:20] <gds> своеобразные ощущения -- взять кучу кода, написанного с кучей типов, их преобразований и прочего, когда ещё задача была совсем не ясна, и "сократить его численность" раза в три, попутно внося идеологическую ясность. и жалко, и полезно.
[22:20:56] <ygrek> http://caml.inria.fr/mantis/view.php?id=4012
[22:21:34] <ygrek> можно использовать как ответ на "почему камло не захватило мир?"
[22:21:55] <gds> да, epic fail.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!