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

GMT+4
[00:13:21] <ygrek> да да
[00:13:56] <ygrek> это можно сделать не залезая во внутренности?
[00:14:32] <ygrek> ещё crap -- http://repo.or.cz/w/ocaml-mysql.git
[00:16:24] <gds> насчёт tail-rec -- только эвристически, что ерунда. Про исключения -- может можно, не уверен. Чистоту-сайдэффекты следить -- сомневаюсь.
Помнишь же, как в преддверии сапки обсуждали простую задачу -- pa_safeuse (захватывать/освобождать ресурсы), которую без извратов не решить. Вот и думаю, что препроцессора в целом будет слишком мало.
[00:17:08] <ygrek> угу, ну а всякие -dinstr, -dlambda?
[00:20:30] <gds> уже лучше. Очень вероятно, что хватит их, смотреть глубже надо.
Конечно, подумав, вынужден отвязать эту задачу от задачи "поковырять typedtree типа как camlp4 ковыряет исходники". Ибо разные они: одно -- read-only, другое -- read-write с неясными последствиями в рантайме (знание компилятора нужно ибо).
[00:25:01] <gds> как минимум, для этой задачи нужно уметь передавать типа-флаги (которые не только флаги, но может и более сложные структуры данных) с camlp4-уровня на нужный уровень, где их можно будет проанализировать.
[00:25:34] ygrek вообще не представляет все эти сферы
[00:26:20] <gds> а это, кстати, самое хорошее в этом всём мероприятии. Потому что так будет гораздо интереснее.
[00:27:44] <ygrek> :)
[00:40:35] ygrek читает код ermine и смеётся
Ontermediate commit
lol

[00:45:14] aloner2k вышел(а) из комнаты
[00:47:02] <gds> кстати про разработку кода. я overbld делал с двумя целями: важнее на практике было ocaml/mingw, но не только. Хочу иметь нормальный билд свежих библиотек под любой нужной мне платформой. Типа "для разработчиков". Там у меня уже вполне работающая "инфраструктура", позволяющая поставить под нужный префикс кучу всего посредством пары команд. Я даже под убунтой этим пользуюсь -- у меня свежий окамл, а не 3.10.2, как минимум. Как вариант, можно туда присобачить фишку наподобие "определённые пакеты обновить из репо, брать бранч/тэг xxx".
Но кому это нужно: под виндой -- ставить msys+mingw, подо всеми платформами -- качать и компилировать всё это дело. Вот так и обосралась идея насчёт разработки кода :)
[00:47:56] <ygrek> gds: оверблд получился как аналог godi
[00:48:03] <gds> хуже!
[00:48:21] <ygrek> у godi куча людей/мейнтейнеров - и он(о) всё равно в полудохлом состоянии
[00:49:18] <gds> различие в том, что я предоставлю репозиторий с почти публичным пушем.
[00:49:23] <ygrek> ermine: это ж сколько надо будет разных репок клонить для sulci?
[00:49:25] <gds> хотя в целом да.
[00:49:52] <ygrek> глобальный проект - много сил надо чтобы на плаву держать
[00:51:02] <gds> глобальный проект -- угу. надо подумать, лучше ли это, чем клонить кучу репок.
[00:51:55] <ygrek> э, это было про bld
[00:52:08] ygrek off
[00:52:47] <gds> я так и понял. так вот и вариант -- одна большая или много малых.
[01:08:25] ygrek вышел(а) из комнаты
[07:22:34] sevenov вышел(а) из комнаты
[07:53:21] sevenov вошёл(а) в комнату
[09:54:10] ygrek вошёл(а) в комнату
[10:33:57] Typhon вошёл(а) в комнату
[10:45:26] sevenov вышел(а) из комнаты
[10:47:17] Typhon вышел(а) из комнаты: offline
[11:59:54] <gds> мда, не предусмотрел я, что при лексинге utf8 ocamllex'ом нужно будет думать о том, чтобы преобразовывать позицию ошибки, которая сейчас является смещением в байтах с начала строки, в смещение в символах.
[12:06:36] <ygrek> можно просто tail строки выводить - ошибка рядом с тем-то и тем-то
[12:11:04] <gds> пытаюсь всегда писать потоковую обработку, насколько это возможно. в этом случае придётся отказаться от неё?
[12:12:54] <ygrek> ну при ошибке вызываешь правило tail которое тянетиз потока N байт
[12:17:26] <gds> хорошая идея. главное только чтобы N было таким, чтобы символ не разрезало.
[12:17:56] <gds> подумалось.
У меня громатека состоит из переводов строки, обычных пробелов, ascii-символов и атомов. Только атомы могут включать utf8-символы, следовательно. И ошибка может быть только вне атома. А если в правиле, которое матчит атом, корректировать позицию в lexbuf.lex_curr_p.pos_cnum (вычесть разницу между длиной атома в байтах и длиной атома в символах)?
[12:19:28] <ygrek> бинго :)
[12:19:56] <gds> (а хотя, разрезание символа -- фигня. можно эвристически -- "не менее N байт, но до low-ascii byte")
[12:44:37] <gds> "Carefully crafted invalid UTF-8 could make these skip a terminating NUL, create a slash or NUL after these have been checked for, or conversely make one of a pair of matched quotes disappear. Invalid UTF-8 has been used to bypass security validations in high profile products including Microsoft's IIS web server."
получается, чтобы не иметь гемора в целом, на инвалидную utf8 нужно ругаться, и не пытаться полу-умными способами синхронизироваться со следующим символом.
[13:06:00] <ermine> ик
[13:06:24] <ermine> ygrek: (скромно) да
[13:07:06] <ermine> а вот с ontermediate commit явно злобная опечатка
[13:34:34] sevenov вошёл(а) в комнату
[13:51:58] sevenov вышел(а) из комнаты
[13:54:28] <gds> фигня получается с лексером.
adj: start: lnum=4 bol=15 cnum=15, curr: lnum=4 bol=15 cnum=27 -> lnum=4 bol=15 cnum=21
adj: start: lnum=4 bol=15 cnum=29, curr: lnum=4 bol=15 cnum=30 -> lnum=4 bol=15 cnum=30
в первой строке скорректировали cnum, было 12 байтов, стало 6 символов. вторая строка -- следующий токен, идущий через пробел от первого. у него cnum берётся такой, как будто коррекции не было.
код в lexing.ml это подтверждает: для нового токена берётся
pos_cnum = buf.lex_abs_pos + buf.lex_curr_pos
попытки скорректировать как lex_curr_pos, так и lex_curr_pos + lex_start_pos + lex_abs_pos вместе приводят к тому, что лексер в следующих токенах продолжает чтение с неправильных байтов.
попробую ещё похакать это дело, но криво это. нужны другие идеи. пока получение позиции не кажется нереальным, чтобы прибегать к показу хвоста.
[14:05:34] <ermine> gds: а что ты парсишь собсно?
[14:05:42] <ermine> я видимо что-то пропустила тут
[14:07:30] <gds> пытаюсь полексить простой utf8, чтобы он мне давал правильные сообщения об ошибках. Если есть строка "ква ку" в утф, и ошибка в токене "ку", то мне надо показать смещение 4 относительно начала строки, а не 7, как в случае разбора по байтам.
[14:07:44] <gds> ну, пошёл пиарить оверблд в камл-листе, там как раз тема благодатная.
[14:09:20] <ermine> это второй уровень разбора
[14:09:29] <ermine> на первом уровне позиция 7, да
[14:09:51] <gds> ну вот, позиция 7 мне не нравится.
[14:10:16] <ermine> но она имеет больше смысла для починки инпута
[14:10:45] <ermine> кроме того, утф позволяет найти следующую позицию предположительно правильнного токена
[14:11:21] <ermine> поскольку по первому байту всегда можно определить число следующих привязанных к нему байтов и первый байт никогда не встречается в тех остальных байтах
[14:11:58] ermine пользуется этим когда хочет культурно обрезать строку справа
[14:12:54] <ermine> сульци отправляет в общий чат кусок большой мессаги, откусив по лимиту и подравнивает по утф
[14:29:52] <gds> идею понял. Но всё же, разбив лексером на токены, не хочется обратно преобразовывать эти токены в длины их утф-строк, чтобы посчитать позицию в строке.
[14:31:08] <ermine> gds: у тебя имхо ошибка в архитектуре
[14:32:21] <ermine> gds: ты считаешь позиции в входных данных прямо из input_line () функции, а это неправильно
[14:32:33] <ermine> у тебя для парсера вовсе не эти данные - входные
[14:32:51] <ermine> сделай надстройку над input_line
[14:33:21] <gds> может и ошибка. но если не брать правильную выдачу ошибок, то простой ocamllex отлично разбирается с utf8.
[14:33:43] <ermine> у меня есть аналогичная задача для xml парсера, мне тоже хочется чтобы оно иногда выдавало координаты ошибки, надо сделать функтор выдачи входных данных
[14:34:38] <ermine> gds: не, я про то, что у тебя должно быть
input_line -> decoder -> parser
[14:34:55] <ermine> gds: не, я про то, что у тебя должно быть
input_line -> decoder -> lexer -> parser
[14:35:00] <ermine> так еще лучше
[14:35:38] <ermine> и можно наверное даже двухуровненную систему координат выдавать
[14:36:31] <gds> у меня не особо line-oriented поток, поэтому разбивать на строки внешней функцией влом.
декодер -- чего куда? байты в utf8-символы? но зачем, если за исключением одной мелочи всё работает без вникания в то, utf8 там или ascii.
[14:36:40] <ermine> выдавать pos 4 (7)
[14:37:38] <ermine> gds: это не должно быть проблемой :)
[14:38:43] <ermine> gds: вон в xml парсере входные данные проходят сначала через декодер, потом выбрасывание лишни \r\n и только потом отдаются лексеру
[14:40:49] <ermine> я только одно в камлевых библиотеках ненавижу: подобные задачи там можно совершать только в глубокой рекурсии внутри stream-функций
[15:04:28] <gds> а у меня сейчас другая идея. гораздо проще и не требует городить подобную систему.
в лексере -- weak hashtable : lexbuf => поправка на ветер с начала строки : int. Поправку менять только при парсинге utf8-строк (ровно одно место лексера) и сбрасывать при достижении новой строки.
Для любого токена менять lexbuf.lex_{start,curr}_p согласно поправке.
Это сильно проще. Люблю простые тупые решения.
[15:06:25] ermine начинает рыдать над xml schema
[15:06:51] <ermine> ygrek: к ты знаешь xml schema?
[15:07:57] <ermine> gds: а когда weak очистится?
[15:08:22] <gds> когда с lexbuf прекратят работать и он соберётся мусорщиком.
[15:09:27] <ermine> значит в потоковом xml это не годится
[15:09:35] <gds> конечно, не годится.
[15:11:17] <ermine> ну тогда твоя идея небезопасна и для файла
[15:11:25] <ermine> забьешь память :)
[15:11:35] <gds> поясни, каким образом.
[15:11:52] <gds> накатал телегу в caml-list. там одна маленькая нестыковка насчёт того, что я не распространяю бинарные билды, но фактически так и есть: и хостингу скоро придёт конец, и не так уж много народа качает их. Так что не ломайте кайф :)
[15:12:24] <ermine> ну загрузи файл размеров 1gb
[15:13:54] <ermine> gds: а у тебя на хостинге сколько гигазов лежат?
[15:15:11] <gds> у меня парсер строит выражение в памяти -- синтаксическое дерево. Я даже не подразумеваю, что 1гб дерева влезет на 32битных машинах в память.
А лексеру проблем не будет: при отдаче даже гигабайта токенов сам лексер не будет кушать память особо, кушать будет парсер, строящий дерево.
[15:17:35] <gds> на хостинге, по расчётам (если убрать мусор) -- 150..250мб полезного, 500мб в пике.
пока думаю похостить у себя, а дальше поглядим. качают очень редко, поэтому без особых проблем можно тупо убить хостинг.
думаю где-нибудь поднять меркуриал репо с оверблд, тут мне никто из чятика не поможет.
[15:47:51] <ygrek> ermine: немного
[15:52:49] <ermine> ygrek: вот я думаю как интерпретировать первый minOccurs в такой схеме:
<xs:sequence minOccurs='0'>
<xs:element name='name' type='xs:string' minOccurs='1'/>
<xs:element name='version' type='xs:string' minOccurs='1'/>
<xs:element name='os' type='xs:string' minOccurs='0'/>
</xs:sequence>
[15:54:58] <ygrek> значит элемент поциональный
[15:55:27] <ygrek> * опциональный
[15:55:51] <gds> "поциональный" -- зачот :)
[15:56:10] <ermine> ну последовательность необязательна, да, но это не объясняет что сам элемент, который содержит эту последовательность, может быть пустой
[15:56:40] <ermine> вот и гадаю - то ли name/version таки обязаны присутствовать, или нет
[15:57:17] <ygrek> seq может присутствовать, может не присутствовать
[15:58:09] <ygrek> если он присутствует то в нём должны быть name и version
[15:58:28] <ygrek> хотя лучше конечно маны почитать
[15:58:35] <ermine> понятно, спасибо
[15:58:49] <ermine> а как ты sql собираешься описывать в схеме?
[15:59:56] ermine разобралась с тем куском схемы
[16:00:09] <ermine> оно означает что <query/> может быть пустым
[16:00:51] <ermine> ой это не сюда
[16:01:58] <ygrek> а зачем sql описывать в схеме? o_O
[16:02:21] <ermine> а зачем тебе генератор кода из xml?
[16:02:35] <ermine> я тогда не поняла твоего интереса
[16:03:53] <ygrek> ну я ведь не только sql query сочиняю :)
[16:04:53] <ygrek> иногда бывает всякий самопальный xml на входе. лень каждый раз писать тучу xpath подобного кода со всеми проверками
[16:06:27] <ermine> у моего генератора задача другая - писать декодер/енкодер в какой-то тип данных
[16:06:52] <ygrek> ну это оно и есть
[16:06:53] <ermine> чтобы примерно как в xmpp/xep_version.ml в гит репе
[16:07:36] <ermine> мне генератор нужен чтобы не мучаться с расширениями xmpp и вручную разбирать что там
[16:09:06] <ygrek> угу, именно
[16:17:55] Genix вошёл(а) в комнату
[16:18:50] Genix вышел(а) из комнаты: offline
[16:30:59] Genix вошёл(а) в комнату
[16:35:23] Genix вышел(а) из комнаты: offline
[16:37:02] <ermine> кажись cduce умеет схемы
[16:37:51] <sceptic> Хм.. А конфиг сульци планируется сделать на чём то более изящном чем xml?
[16:39:35] <ermine> на чем-то сферическом?
[16:40:04] <ermine> пришли патч :)
[16:40:33] <ermine> там плагины теперь больше не знают как был написан конфиг, так что это уже более не проблема
[16:41:32] <ermine> я еще собиралась прикрутить ini конфиг, но поняла, что не знаю как смапить в ini xml
[17:09:53] ermine погуглила по хмл схемам код генераторам и осталась недовольна - почитать почти нечего
[17:12:30] <ermine> вот есть тулза на ява castor, монстрище
[17:15:51] <sceptic> ermine: например блок <account/> можно было бы представить так: http://dumpz.org/12087/
[17:18:00] <ermine> sceptic: да, блок аккаунта в ini очень легко представляется, и почти на этом щастье кончается
[17:18:17] <ermine> sceptic: ты давай продолжай
[17:18:25] <sceptic> сейчас ещё покумарю.. надо бы какой-нибудь побольше конфиг
[17:18:40] <sceptic> вообще я даже представляю как это из xml дампить
[17:19:16] <ermine> в конфиге блок плагинов вставляет
[17:19:26] <ermine> из-за строк <command/>
[17:19:44] <sceptic> надо по примеру hg сделать
[17:20:29] <ermine> ну переложи всё
[17:20:45] <sceptic> сейчас подумаю
[17:20:48] <ermine> в <command/> три параметра - key, name и access, последний необязателен
[17:21:08] <ermine> может и name тоже необязателен
[17:22:00] <ermine> key - это ключ, по которому команда сульци найдет свои параметры в конфиге, name - это имя команды, по которому команда регистрируется в plugin_command.ml, access - имя класса доступа
[17:23:29] <ermine> в планах кстати есть plugin_aliases, который будет изменять входные строки на то, что последующие плагины будут видеть, а не только алиасы команд
[17:23:32] <sceptic> те я как это представляю. твой парсер конфигов обрабатывает весь конфиг, даже если там какие-то "неизвестные" блоки и опции есть, кладёт его в хэш block_name -> options, а каждый плагин сам уже смотрит, что там лежит
[17:24:55] <ermine> плагин получает свой блок, лежащий внутри <plugin/>
[17:25:32] <sceptic> так ничего не выйдет мне кажется.
[17:25:42] <sceptic> ибо вложенных блоков в INI нет
[17:26:10] <ermine> ага
[17:26:50] <ermine> вот и мапа не получится, так что нужна идея как вообще представить в другом формате
[17:27:18] <ermine> а кроме ini я больше ничего не знаю
[17:28:05] <ermine> можно еще взять конфиг бинда - named.conf, там все в фигурных скобочках :)
[17:29:09] <sceptic> http://dumpz.org/12088/
[17:30:27] <ermine> а сислог ты не осилил, кстати как оформлен логгер, можно заценить в конфиге постфикса
[17:30:38] <ermine> там тоже key=value формат
[17:30:50] <ermine> и сначала задается тип логгера, а потом его параметры
[17:32:02] <ermine> с acl беда
[17:32:40] <sceptic> да.. там вообще не ясно как делать, пока что
[17:35:03] <ermine> в блоке можно первой строкой
name='name', где ищем следующий блок с этим именем, а там параметры чего-то
[17:35:50] <sceptic> можно например так
[17:36:23] <sceptic> botmaster = ermine@j.ru alexey@j.ru teo@j.ru
[17:36:54] <ermine> это там где можно по пробелам дробить
[17:37:01] <sceptic> botmaster = ermine@j.ru, alexey@j.ru, teo@j.ru
[17:37:06] <sceptic> через запятую
[17:37:20] <ermine> ну неважно
[17:37:34] <ermine> в ресурсе пробелы и запятые допустимы
[17:38:15] <sceptic> мды..
[17:38:23] <sceptic> чертов RFC
[17:39:02] <ermine> да можно несколько строк botmaster, key в блоках не обязаны быть уникальными
[17:39:21] <ermine> в ini вообще ничего не уникально
[17:39:39] <sceptic> ну есть общепринятое соглашение, о том что нестоит использовать одинаковые имена параметров несколько раз
[17:40:18] <ermine> в именах блоков - да, но внутри можно
[17:41:33] <ermine> вот возьми плугин vocabulary и переложи иво в ини
[17:41:38] <ermine> там многа команд
[17:42:47] <sceptic> А зачем команды в конфиге описываются?
[17:43:12] <ermine> можно и не там
[17:43:15] <ermine> а где?
[17:43:25] <ermine> можно в plugin_command перенести
[17:43:57] <sceptic> Что я могу этим конфигом сделать? Поменять только имена команд? Я же не могу добавить свои
[17:44:10] <ermine> в конфиге надо описывать дефолтные значения, если они отличаются от дефолта
[17:44:20] <ermine> я там вписала всё, чтобы не забыть просто
[17:44:42] <ermine> и их надо закомментарить, все что не отличается от дефолта
[17:45:28] <ermine> sceptic: да, поменять дефолтное имя команды и дефолтный доступ
[17:45:48] <sceptic> ясно..
[17:46:49] <ermine> gds: а мы тут не оффтопим случаем?
[17:46:52] <ermine> :)
[17:47:26] <sceptic> можно попробовать представить это в виде:
[vocabulary]
cmd_<command_name> = <access> ;; cmd_wtfremove = owner
[17:47:59] <sceptic> правда как rename сделать, неясно
[17:48:00] <ermine> ужос
[17:49:56] <sceptic> о.
[17:50:40] <sceptic> [alias]
wtf = wtfwtf
[17:51:03] <ermine> это тупо
[17:51:16] <ermine> в алиасах будут регэкспы
[17:51:43] <sceptic> зачем там регеспы?
[17:51:58] <ermine> а регэксп - это пара строк: шаблон и результат
[17:53:24] <ermine> ^wtf\s+(.+)" -> "google $1"
[17:53:41] <ermine> круто?
[17:53:45] <sceptic> ппц
[17:55:41] <sceptic> в общем, чем меньше скобок будет тем лучше :) ini самый скоб-лесс формат который можно только придумать
[18:06:57] <ermine> вон те регэкспы в это не влазят
[18:08:09] <ermine> надо полазить по другим программам и посмотреть чем там страдают
[18:08:14] <gds> я вон наоборот оформляю s-выражениями многое (ссскобки! моя прелесссть!). чего вам они не нравятся -- ума не приложу.
[18:10:13] <ermine> gds: да мне и хмля хватает, особенно после того как увидела в конфиге ocsigen как там имплементировано if/then/else
[18:11:10] <ermine> <if cond='1'><then a="2"/><else a="3"/></if>
[18:11:13] <gds> xml геморнее писать руками. xml содержит искусственные и усложняющие разделения узлов и атрибутов.
[18:11:40] <ermine> да, руку надо набить
[18:12:15] <gds> это не в плюс xml'у.
[18:13:07] <ermine> чтобы камлить на камле, руку тоже надо набить - это его минус?
[18:17:58] <ermine> а для тупого юзера нужен только графический интерфейс к настройкам любой программы, иначе никак
[18:18:52] <ermine> в принципе можно на lablgtk2 сваять конфигурялку, заодно юзеры будут готовы когда-нить скомпилить горгону
[18:23:02] <gds> чтобы программировать, нужно знать язык программирования. Но плох тот язык, на котором для выражения простой мысли нужно во много раз больше кода, чем на другом языке. В том числе поэтому мне нравится функциональщина, нравятся s-выражения, не нравится xml, не нравятся c/c++/java, например.
[18:24:21] <ermine> gds: ассемблер - самый ужасный язык?
[18:24:56] <gds> для высокоуровневого кода -- почти самый. только машинные коды и перемычки на плате хуже.
[18:25:28] ermine штудирует исходники ocamlduce и офигиевает от новых идей
[18:28:44] <ermine> функторы надо тщательнее изучить
[18:29:30] <gds> и остальные лузерские части языка тоже. полиморфные варианты, объекты..
[18:33:38] <ermine> ага
[18:33:49] <ermine> не, варианты нафик
[18:38:47] <ermine> gds: сколько лет ты возишься с камлом?
[18:41:30] <gds> примерно 8.
[18:43:19] <ermine> эх, значит больше меня
[18:43:32] ermine смиренно смотрит на gds снизу вверх
[18:47:16] <gds> да не круглые сутки я с ним вожусь ведь. а есть монстриллы, которые только одной функциональщиной и живут. вот на них-то стоит смотреть. а я -- дилетант. ухватил интересное и ковыряю бессистемно.
[18:54:59] <ermine> хреново в duce с xsd
[18:58:47] <ermine> нучтож, будем сами топтать верблюда
[19:46:02] <gds> впервые в жизни сознательно указываю, что для хеш-таблицы в качестве хеша нужно выбирать постоянное значение. Ну а как ещё Lexing.lexbuf хешировать...
[20:19:03] gds вышел(а) из комнаты
[20:28:44] gds вошёл(а) в комнату
[21:06:02] ermine увлеченно строчит парсер xsd
[21:10:48] <ermine> блин, слово constraint - зарезервированное камлем слово
[21:11:12] <ermine> gds: а как применить в камле слово constraint?
[21:13:12] <gds> я недавно применял так:
type master 'j = repr 'j 'q constraint 'q = Mrq.w. 'j;
[21:13:33] <gds> а вообще -- по-всякому можно. Конечно, с разумными ограничениями.
[21:14:23] <gds> чтобы был понятен пример, уточню кое-что.
[21:15:03] <ermine> хмм, оно за пределами моего кругозора
[21:15:12] <ermine> надо будет подучить матчасть
[21:16:56] <gds> мне надо было сделать job farm -- хозяин пихает задания, рабы исполняют. "multiple readers queue" -- Mrq. Mrq.w 'a для пишущего конца, Mrq.ir 'a для читающих.
И типы в целом такие:
type repr 'j 'q =
  { job_any : Queue.t 'j
  ; job_all : 'q
  ; result : farm_res
  ; frozen : ref bool (* to share it *)
  }
;
type master 'j = repr 'j 'q constraint 'q = Mrq.w 'j
;
type slave 'j = repr 'j 'q constraint 'q = Mrq.ir 'j
;
обрати внимание на поле job_all и его типы везде.
[21:20:12] ygrek вышел(а) из комнаты
[21:20:14] <gds> можно было бы без constraint'ов (я почти впервые его применил тут), но не знал, куда этот код будет дальше развиваться, а лишнюю гарантию поставить полезно.
[21:21:11] ermine сообразила только щас, что поля рекорда не закомментированы
[21:23:04] <ermine> идею примерно поняла
[21:25:12] <ermine> gds: ограничение полиморфизма?
[21:25:25] <gds> синтаксически -- стиль извращённый, но удобен для модификаций, копипаст и всего прочего.
[21:25:48] <gds> в этом примере -- да, именно. Глубже не сильно ковырял.
[21:26:49] <ermine> а если вместо этого просто вписать в типизацию аргументов?
[21:27:03] <ermine> ну (q:Mrq.w)
[21:28:10] <gds> хм. А ведь верно: если и в типизацию, и везде при создании значения следить за типом q, то получится ровно та же фигня.
[21:29:16] <ermine> еще проще - в mli вписать и всё
[21:29:42] <ermine> компилятор задумываться не будет вообще, глядя на mli
[21:30:18] <gds> ну, принцип-то такой. Я не знал, куда этот код дальше пойдёт и что с ним будет, поэтому решил вот именно так ограничить сие. Внутренний модуль городить не хотелось.
[21:31:20] <gds> но, по сути, вся типизация -- как раз привязка типа к значению. Можно было бы вообще везде с 'a работать, а в сигнатурах описывать конкретно что хочешь, int или string. То есть, система типов.
[21:32:54] <ermine> понятно
[21:42:41] <gds> кстати, про вот такую, не суть как важную типизацию, вспоминаю, как красиво pierre weis в caml-list привязал private-типы к quotient-структурам. тогда я почти ничего не понял, но, как начал потихоньку читать теорию категорий, понимание стало приходить. но и то, сейчас внятно объяснить не возьмусь :)
И слегка пеар теории категорий: полезная штука для упорядочивания мышления. Нехилый, мать его, слой абстракции. В оформлении интерфейсов помогает -- видно, где лажа, видны пути кошерирования.
Только не надо связывать это со всякими хаксилями. Это совершенно разные вещи.
[21:50:27] ermine теорию категорий не знает
[21:56:03] ermine раздумывает, как сделать такой constraint - список обязан быть непустым
[21:56:52] <gds> никак, ибо dependent types -- типы, зависящие от рантайма.
[21:57:07] <gds> * ибо это
[21:57:50] <gds> извернуться можно --
type nonemptylist 'a = ('a * list 'a)
гарантия тупая -- тупл :)
[21:59:10] <ermine> да я хотела продешевить на этой проверке
[21:59:23] <ermine> но придется проверять вручную
[21:59:51] <gds> не, тут скорее таки вручную. остальные варианты хуже, в том числе мой.
[22:00:24] <ermine> вдобавок я еще только погружаюсь в xml schema, там верхушка айсберга кажется плоской как матрац
[22:00:56] <ermine> и читать спецификацию лень
[22:01:20] <ermine> слишком много букв
[22:03:25] <gds> гугль говорит, что "Ermine can climb trees and swim". И с айсбергом асилишь.
[22:06:16] <ermine> айсберг скользкий
[22:07:35] <sceptic> А когти и клыки тебе зачем?
[22:09:08] <ermine> клыки? ермайнов часто путают с грызунами
[22:23:54] sceptic вышел(а) из комнаты
[22:26:48] sceptic вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!