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

GMT+4
[00:28:09] <ermine> интересно, как динамически грузить плугин .cmx
[00:28:39] <ermine> error loading shared library: ./plugins/plugin_command.cmx: invalid file format
[00:28:47] <ermine> gds: сталкивался?
[00:31:31] 604 вышел(а) из комнаты
[00:31:36] <ermine> мож оно только cmxs жреть
[00:31:46] <ermine> завтра посмотрим
[00:32:01] <ermine> спать
[00:57:43] <gds> вроде .cmxs для того и сделали. его пробуй.
[04:02:35] Michael Holub вышел(а) из комнаты
[04:02:47] Michael Holub вошёл(а) в комнату
[05:11:46] Michael Holub вышел(а) из комнаты
[05:12:06] Michael Holub вошёл(а) в комнату
[05:12:10] Michael Holub вышел(а) из комнаты
[06:50:00] john вышел(а) из комнаты: Replaced by new connection
[06:50:01] john вошёл(а) в комнату
[08:02:21] john вышел(а) из комнаты
[08:26:56] john вошёл(а) в комнату
[09:51:11] <ermine> камлобилд втупую не строит cmxs
[09:59:35] Typhon вошёл(а) в комнату
[10:26:22] f[x] вошёл(а) в комнату
[10:26:57] <ermine> http://caml.inria.fr/mantis/print_bug_page.php?bug_id=4651
[10:35:07] <gds> можно и руками как-нибудь собрать.
хотя вот перечитываю и понимаю, что совсем не уверен, что нужно cmxs. почитай документацию, вдруг я обманул.
[10:37:37] <ermine> в доке про dynlink написано как раз "usually .cmxs"
[10:38:11] <ermine> но мне кажется что cmxs - эточто-то типа -pack
[11:05:48] <ermine> тот еще гимар с компиляцией, ладно, пока поиграюсь с байткодом
[11:06:03] <ermine> не -pack, а -shared
[13:22:42] john вышел(а) из комнаты
[13:49:16] john вошёл(а) в комнату
[14:10:16] Typhon вышел(а) из комнаты: Replaced by new connection
[14:10:17] Typhon вошёл(а) в комнату
[15:14:21] f[x] вышел(а) из комнаты
[15:36:37] <sevenov_> о, на жабер.ру сменили капчу?
[15:37:02] <gds> о, на жаббер.ру есть капча?
[15:37:46] <sevenov_> ггг
[15:37:50] sevenov_ изменил(а) имя на sevenov
[15:38:39] <gds> кстати, оффтопик, но лучшая виданная мной капча -- матановая. впрочем, и лямбда-капчу несложно оформить.
[15:40:36] <sevenov> gds, нууу, я бы сказал, она лучше, чем g5fH6, но все равно можно.
[15:43:22] f[x] вошёл(а) в комнату
[16:12:09] Typhon вышел(а) из комнаты
[16:13:03] Typhon вошёл(а) в комнату
[18:03:18] sevenov вышел(а) из комнаты
[18:05:32] sevenov вошёл(а) в комнату
[18:37:48] Typhon вышел(а) из комнаты
[18:38:34] Typhon вошёл(а) в комнату
[19:13:56] Typhon вышел(а) из комнаты
[19:18:21] <f[x]> Printexc.to_string какой-то недостаточно рекурсивный..
[19:19:15] <f[x]> Xmlm.Make(String)(Buffer).Error(_, -764030554)
[19:19:29] <f[x]> type pos = int * int
exception Error of pos * error
[19:19:56] <f[x]> так что по крайней мере позицию то можно было вывести нормально, ан нет..
[19:27:35] <gds> видимо, выводит только базовые типы. но свинство.
[19:28:16] <gds> если исключение только для ошибок, может при его броске распаковывать тупл?
[19:30:26] <gds> кстати, есть же какая-то простенькая функция, которая просто рекурсивно шарится по значениям и выводит их так, как они лежат в рантайме. Может Printexc.to_string заменить ей?
[19:32:34] <f[x]> Std.dump
[19:33:11] <f[x]> у меня прижилась обёртка над printexc.to_string которая все интересные exn'ы матчит и разбирает сама
[19:38:13] <f[x]> ещё штучка - Std.finally напрямую исопльзовать не очень удобно
let bracket resource destroy k = Std.finally (fun () -> destroy resource) k resource
let with_open_in name = bracket (open_in name) close_in_noerr
[19:44:55] f[x] вышел(а) из комнаты
[19:53:00] xkrt_ вошёл(а) в комнату
[19:54:39] <xkrt_> подскажите, окемловцы
[19:54:53] <xkrt_> какой тип ф-ии выведет окемл
[19:55:00] <xkrt_> let square x = x * x
[19:55:01] <xkrt_> ?
[19:56:18] <gds> по умолчанию -- int -> int
[19:57:07] <xkrt_> а как сделать, чтобы он вывел какой-нибудь общий тип, чтобы можно было совать туда и int и float ?
[20:04:35] <gds> никак.
[20:05:29] <gds> hindley-milner type system ибо.
[20:06:02] <gds> да и операции умножения на int и на float слишком разные. ни одна из них не является "подтипом" другой.
[20:06:42] <xkrt_> я просто ньюб). я думал он выведет для какого-нибудь оьщий тип, для которого определен *. что-нибудь вроде num -> num
[20:07:47] <xkrt_> я просто читаю статью про F#, там написано что тип square: 'a -> 'a, а интерпретатор говорит int -> int
[20:08:40] <gds> пример кода точно такой же?
[20:09:35] <xkrt_> http://habrahabr.ru/blogs/programming/55272/
[20:09:49] <xkrt_> поиск по "let square x = x*x"
[20:10:37] <gds> "Дон Сайм (Don Syme), главный создатель F# когда-то приложил руку и к OCaml"
странно.
[20:11:11] <xkrt_> первая версия фшарпа на кемле писана вроде как
[20:12:02] <gds> да, но приложил руку, как я подразумевал, это принял участие в разработке.
ну да фигня.
[20:13:16] <xkrt_> враньё про 'a -> 'a ?
[20:14:18] <gds> "имеет тип 'a -> 'a, где 'a может быть int, float, и вообще говоря любым, для которого перегружен оператор *."
как я понял (в том числе по другим примерам), они передают "словарь" операций -- нечто вроде таблицы методов. Там они в рантайме (в худшем случае) смотрят, есть ли *, и, если есть, вызывают нужную функцию.
[20:16:46] <gds> а, они и type information в runtime тащат, судя по примерам ниже. нуну.
[20:17:46] <xkrt_> ммм... в строго типизированном языке смотрят в рантайме? всмысле смотрят как используется ф-ия и уже в рантайме она тип меняет? или как?
[20:18:21] <xkrt_> я пытался сам задать тип x как ;a - выскакивает ворнинг и всё равно тип int
[20:22:46] <gds> в строго-типизированном языке, предполагаю, типизируют всё-таки на этапе компиляции. Уж не знаю, как в F#, но думаю, что так.
А в рантайме -- вызывают код в зависимости от конкретного значения.
Сейчас нарисую кое-что подобное.
[20:33:19] <xkrt_> ты нарисуй, а я пойду спать :) потом в логах прочту
[20:33:24] <xkrt_> спасибо за ответ
[20:33:28] xkrt_ вышел(а) из комнаты: ((lambda () (exit 0)))
[21:11:59] <gds> xkrt_: http://paste.defun.ru/m61ccce1a
[21:13:04] <gds> адский original syntax! пока понял, почему не тайпчекается код вида
let toplevelvalue = somefunc someargs
print_string "kva"
-- чуть не поседел.
[21:29:29] Genix вошёл(а) в комнату
[22:01:10] ygrek вошёл(а) в комнату
[22:34:39] Genix вышел(а) из комнаты
[22:34:53] Genix вошёл(а) в комнату
[22:35:09] Genix вышел(а) из комнаты
[22:35:55] Genix вошёл(а) в комнату
[22:38:09] <ermine> gds: в туареге это не пройдет
[22:39:15] <gds> это который автоматом выравнивает?
[22:39:29] <ermine> ага
[22:39:43] <ermine> gds: кстати, а ты flymake юзаешь?
[22:40:46] <gds> выравнивание кода за меня я считаю игнорированием моей творческой составляющей. По требованию это допустимо, но не более.
[22:41:18] <gds> flymake -- что-то слышал от тебя годы назад, но посмотрел и забил. Сейчас даже не помню, что это такое.
[22:42:30] <ermine> высвечивает строку, которая компилятору не нравится
[22:43:14] <ermine> туарег+flymake= я часто пишу код днями, пока не решусь скомпилять
[22:47:14] <ermine> высвечивает строку - в смысле, высвечивает сразу, во время творческого процесса написания кода, на лету
[22:49:29] <gds> это flymake делает? мило, однако. а текст ошибки показывает?
[22:50:38] <ermine> flumake - это скрипт, который дергает компилятор любого языка, парсит его вывод и передает координаты и ругань компилятора емаксу, когда ты изменяешь состояние буфера
[22:51:09] <ermine> в нашем случае это ocamlc -c
[22:55:32] <gds> понятно. а текст ошибки показывает?
[22:56:14] <ermine> по хоткею, но я на него не обращаю внимания
[22:57:47] <ermine> я flymake применяю и для писания скриптов на баше
[22:57:57] <gds> как это?
[22:58:48] <ermine> а это встроенное в flymake
[22:59:03] <ermine> не разбиралась что он там вызывает
[22:59:37] <ermine> а так он настроен у меня для ocaml, erlang, js, lua
[23:01:51] <ermine> и хаскиль
[23:04:03] ermine поела винограду и смотрит на еще одно концептуальное местечко в сульце - надо придумать модель доступа
[23:04:49] <gds> кстати, если суровое пишешь на баше, есть coding guide, сам песал.
[23:05:18] <gds> а насчёт доступа -- в жыжыцэ хвастались, что простенький пролог имплементили за часик, вот и права доступа.
[23:06:48] <ermine> да, с прологом хорошо сравнивать :)
[23:07:03] <ermine> а coding guide - это талмуд?
[23:07:06] <ermine> где?
[23:07:24] <ermine> я скрипты нечасто пишу, правда
[23:08:31] <gds> пролог и реализовать несложно. нужен же не полный вывод, а всего лишь возможность сказать, имеет ли кто-либо право на какой-либо доступ. тут алгоритм сильно проще поиска.
[23:09:48] <gds> про баш -- http://gds.livejournal.com/42541.html?mode=reply
[23:10:36] <ermine> у меня пока намечаются две вещи -
<acl jid='gds@jabber.ru' class='admin'/>
<command name='ping' access='admin'/>
[23:12:20] <gds> ну это весьма простая штука. уверена ли, что дальше это будет так же просто?
или может взять где-нибудь простую реализацию пролога и влепить её себе?
[23:14:02] <ermine> тут надо развивать <acl/>, но способов описывания по-тупому действительно немного, в более же сложном случае хотелось бы использовать скрипты lua для составления сценариев
[23:14:48] <ermine> а талмуд у тебя стоящая штука
[23:15:34] <ermine> пока я так по-тупому aclы и реализую, дальше поглядим
[23:16:02] <ermine> надо закопать ссылку в букмарку
[23:18:33] <ermine> а идея со списками и отношениями пролога все же как-то не очень-то чоткая
[23:21:40] Genix вышел(а) из комнаты
[23:22:01] Genix вошёл(а) в комнату
[23:34:27] <gds> талмуд у меня чисто по безопасному программированию, возможности не раскрывает. настоящий талмуд -- это man bash.
про про лог -- конечно, я бы тоже его не потащил в проект по доброй воле. Разве что если нужда. То есть, пару уровней иерархии (юзеры - группы - команды) ещё можно асилить без него, и щасте, если так без него и дальше сможешь.
луа -- ээ. запутаются. однажды разгребал права доступа в оракловской форме. доступ на десяток элементов, зависит от (как оказалось) четырёх булевых признаков. Но это было более сотни строк кода, все в if'ах (вложенность до третьего уровня), с кучей присваиваний прав (set_{item,block}_property), и с несколькими мутабельными переменными. Видите ли, одному долбоуроду оказалось так легче: присунет где-нибудь if, посмотрит, потестит, и в работу. Анализировал пол-дня, переписал в 15 строк понятнейшего кода, и проблема исчезла. Касаемо луа -- не надо давать юзерам возможность писать императивный/функциональный/оо-код там, где хватает простого декларативного.
[23:36:18] ygrek вышел(а) из комнаты
[23:39:54] <ermine> gds: ты знаешь про RBAC?
[23:50:30] ermine соображает, что для доступа надо делать сортированный список прав, и что лучше обходится без священных чисел, обозначающих уровень доступа
[23:59:22] <ermine> кажись придумала - надо проходить по списку с начала до середины, где обозначен доступ, если у тебя есть доступ в этой первой части - доступ есть
[23:59:37] <ermine> завтра опробуем реализовать
[23:59:51] <gds> rbac -- да. практические применения видел. обязательно "наследование" ролей. но проблемы начинаются при выдаче более хитрых прав. например, из жизни, простое: бухгалтер имеет право только смотреть (1) те склады, с которыми он работает, и, если является материально-ответственным лицом, имеет право на складские движения (2) на своём складе. Допустим даже имеем соответствия "должность -> видимые склады". Если есть роли "просмотр склада" и "проводка складских документов", и если даже есть соответствия "должность -> видимые склады", и если было (1), то потом, выдавая (2), автоматически выдаём права на складские движения по складам, где бухгалтер на это права не имеет.
Но это не слишком хитрый случай ещё.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!