Home
Objective Caml
ocaml@conference.jabber.ru
Вторник, 6 сентября 2011< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | http://camlunity.ru/ (теперь с git доступом!) | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ
[00:12:40] Typhon вошёл(а) в комнату
[01:33:00] Kakadu вышел(а) из комнаты
[03:40:56] Typhon вышел(а) из комнаты
[04:44:08] ftrvxmtrx вышел(а) из комнаты
[04:45:10] ftrvxmtrx вошёл(а) в комнату
[04:46:25] letrec вошёл(а) в комнату
[04:46:28] letrec вышел(а) из комнаты
[04:46:43] letrec вошёл(а) в комнату
[06:26:08] letrec вышел(а) из комнаты
[06:55:45] bobry вышел(а) из комнаты
[06:55:45] ftrvxmtrx вышел(а) из комнаты
[06:55:45] klapaucius вышел(а) из комнаты
[06:56:02] ftrvxmtrx вошёл(а) в комнату
[06:59:44] klapaucius вошёл(а) в комнату
[07:00:32] bobry вошёл(а) в комнату
[08:04:36] Typhon вошёл(а) в комнату
[08:30:52] letrec вошёл(а) в комнату
[08:41:32] Typhon вышел(а) из комнаты
[09:11:09] <letrec> ygrek здесь https://gaiustech.wordpress.com/2010/09/20/ocaml-compiler-errors/ написал, что -pp camlp4o yields a more useful error message
[09:11:17] <letrec> а почему так?
[09:38:30] Typhon вошёл(а) в комнату
[10:27:28] <f[x]> потому что он парсит рекурсивным спуском и в точке возникновения ошибки может сказать (глядя на текущее сосотояние) - какой токен получили и какие варианты токенов ожидали
[10:27:56] <f[x]> а ocaml парсит yacc'ом и там обобщённую обработку ошибок сделать сложно
[10:32:38] <letrec> камловый компилятор производит uncurrying?
[10:36:18] <komar> letrec: хороший ник, кстати.
[10:36:55] <letrec> komar: ну, коротко и даже по теме :)
[10:37:17] <f[x]> letrec: что ты имеешь ввиду?
[10:38:00] <letrec> F# compiler как оптимизацию раскарривает функции
[10:38:29] <letrec> я так понимаю, если статически можно доказать, что они в каррированном виде не используются
[10:38:50] <letrec> это вроде как на GC меньше рагрузку создаёт
[10:38:56] <letrec> нагрузку
[10:39:31] <f[x]> камло этого не делает, но недавно как раз патч для этого был у ocamlpro, так что может будет делать
[10:43:00] <letrec> а как ты трэкаешь что там происходит? комменты к коммитам читаешь?
[10:44:25] <f[x]> да, пробую иногда
[10:55:00] zert вошёл(а) в комнату
[11:22:51] ermine вошёл(а) в комнату
[11:40:35] bobry- вошёл(а) в комнату
[12:03:41] ftrvxmtrx вышел(а) из комнаты
[12:59:58] komar вышел(а) из комнаты: Replaced by new connection
[12:59:58] komar вошёл(а) в комнату
[13:14:46] ftrvxmtrx вошёл(а) в комнату
[13:18:29] Kakadu вошёл(а) в комнату
[13:25:46] ftrvxmtrx вышел(а) из комнаты
[13:51:46] ftrvxmtrx вошёл(а) в комнату
[14:26:29] ftrvxmtrx вышел(а) из комнаты
[15:14:52] АК вышел(а) из комнаты
[15:29:22] <Kakadu> в ирке #haxe тут человек говорит, что код на функциональщине написаный перед дедлайном становится непонятным всем, кроме его автора
[15:33:57] <f[x]> ключёвое слово тут дедлайн, а не ф-а
[15:41:44] <Kakadu> [15:40] <mi6_x3m> both functional and imperative deadline code is extremely unreadable, but deadline functional degenerates to
[15:40] <mi6_x3m> let x i / - do : > aa 4 d rep dd
[15:40] <mi6_x3m> to a series of 1 char tokes
[15:41] <mi6_x3m> tokens *
[15:43:13] <f[x]> бла бла бла
[15:45:37] <Kakadu> [15:42] <Kakadu> mi6_x3m: I agree, this line is unreadable without context
[15:44] <mi6_x3m> Kakadu: thats the problem, if you have time to think on it it will look pretty I know
[15:48:43] <Kakadu> да, это всё-таки были рандомные символы
[15:52:36] <klapaucius> Строка функционального кода часто непонятна вне контекста. С другой стороны, каждая строка императивного кода обычно понятна в отдельности от других, зато в контексте непонятна совершенно.
[15:56:23] <Kakadu> klapaucius: жжошь)
[15:56:26] <Typhon> по-моему, всё зависит от "выразительности" — чем выразительнее инструмент, тем более запутанным будет код в р-те неправильного использования. тут и функциональность может помешать, и метапрограммирование всякое
[15:56:57] <f[x]> дык, with great power comes great responsibility
[15:57:01] <Kakadu> о да, я вспомнил fucktorial
[15:57:18] <f[x]> поэтому людей с неустоявшейся психикой к ФП подпускать нельзя
[15:58:08] <klapaucius> Наоборот, чем выразительнее язык - тем более понятный код на нем (потенциально) можно написать. Если же язык не очень выразительный. Например, как брейнфак - понятный код на нем написать невозможно впринципе.
[16:13:21] ftrvxmtrx вошёл(а) в комнату
[16:55:57] <bobry-> в арче даже extlib поломали, в официальном репозитории
[16:56:04] <bobry-> Error: Files /usr/lib/ocaml/extlib/extLib.cmxa and /usr/lib/ocaml/stdlib.cmxa
       make inconsistent assumptions over implementation String
[18:03:06] <bobry-> кто нибудь может мне объяснить мотивацию для такой кучи? https://github.com/xen-org/xen-api-libs что мешает разбить на пачку отдельных библиотек?
[18:07:24] <Typhon> ну удобнее чувакам так
[18:08:01] <Typhon> gds amall тоже вместе держит, хотя там можно dbi вынести. вроде как удобнее людям так пользоваться, а остальные не требуют разбивать :-)
[18:08:15] <Kakadu> не такая уж большая куча
[18:15:35] <bobry-> Typhon: ну как результат никто кроме них этим стафом воспользоваться не может
[18:19:36] <gds> я вижу больше проблем в необходимости использовать/поддерживать/компилировать/инсталлить кучу разных либ, нежели одну, большую, но относящуюся к одной конкретной области деятельности.  И вообще, почему "воспользоваться не может"?  Кто-то мешает?
[18:20:13] <gds> может вообще, каждый модуль в отдельную либу выносить?  Или даже каждую функцию?
[18:20:45] <gds> pkg_stdlib_list_length, pkg_stdlib_list_rev, pkg_stdlib_list_map, дада
[18:20:54] <bobry-> gds: ну например у них там в куче лоу левел библиотеки для работы с xenовскими фичами и http сервер
[18:20:56] <bobry-> не гоже же
[18:22:03] <gds> я фигею, к чему у людей претензии в последнее время.
[18:27:30] <bobry-> это был пример функциональности которую стоит вынести в отдельную либу
[18:30:14] f[x] вообще не понимает о чём спор, по ссылке куча отдельных либ, каждая со своим META
[18:35:09] <gds> про xen не знаю, но с amall например -- почему стоит?  Я часто использую вместе dbi, http server, withM-идиому, зачем выносить их отдельно?  Чтобы pkg_amall_dbi, pkg_amall_http, pkg_amall_withm, pkg_amall_filew писать в тегах постоянно?  Чтобы n либ носить везде, забывать согласовывать их версии, забывать одновременно пушить изменения во все затронутые либы, забывать инсталлить их одновременно?  Это -- гемор, нужный только для услады гламурных эстетов, практической пользы в этом нет.  Не надорвётся пользователь подключить всю библиотеку и использовать только нужные модули.  Это вообще самое простое решение для всех.
[18:35:54] bobry- почувствовал себя гламурным эстетом ...
[18:37:47] Kakadu вышел(а) из комнаты
[18:38:14] <f[x]> это вообще разные случаи, у меня тоже внутрення либа - "сборная солянка", а у xen всё культурно - все либы как раз отдельные
[18:38:27] <f[x]> чем недоволен топикстартер - неясно
[18:40:06] <bobry-> топиккастер был не прав
[18:40:27] <f[x]> ок
[19:08:20] shaggie вошёл(а) в комнату
[19:20:20] <letrec> f[x]: Xavier утверждает, что камло таки раскарривает функции
[19:20:26] <letrec> http://pauillac.inria.fr/~xleroy/uncurry/
[19:21:50] <f[x]> много кокса - не осилил
[19:22:14] <letrec> я до кокса ещё не дошёл
[19:22:25] <f[x]> я по асмокоду вижу что не делает, а патч от ocamlpro - делает
[19:22:33] <letrec> мне доказательство не к чему - я ему на слово верю :)
[19:22:46] <f[x]> хм
[19:23:03] <f[x]> тогда приведи пример кода, может я что-то другое имею ввиду
[19:23:23] <letrec> когда-то Kouzdra описывал как оно это дело оптимизирует на уровне асма, но ссылку не найду
[19:24:36] <letrec> ну, если есть a -> b -> c -> d и в применении есть все аргументы, то куча клож создаваться не будет
[19:24:49] <letrec> я это так понимаю
[19:25:00] <letrec> ты как?
[19:25:14] <f[x]> ну это то понятно, вопрос в том когда делается частичное применение такой функции
[19:25:27] <f[x]> но все связанные переменные есть в scope
[19:25:36] <f[x]> тогда тоже можно не делать замыкание
[19:26:02] <letrec> а как без замыкания?
[19:26:31] <f[x]> т.е. то что часто делается для сокращения кода - List.map (f x) l <=> List.map (fun y -> f x y) l, если f чистая
[19:27:12] <f[x]> в первом случае камло всегда выделяет блок под замыкание
[19:28:16] <letrec> а во 2м?
[19:29:03] <letrec> я что-то разницу между ними не улавливаю
[19:29:26] <letrec> по мне они отличаются чисто синтаксически
[19:30:27] <letrec> и связь с чистотой не совсем ясна
[19:30:32] Kakadu вошёл(а) в комнату
[19:30:44] <letrec> в камле то её хрен докажешь в общем случае
[19:31:08] <f[x]> в общем да, а для практического профита хватает
[19:32:03] <f[x]> сравни let f x y = print_endline "Q"; x + y и let f x = print_endline "Q"; fun y -> x + y
[19:32:54] <letrec> у них тип разный
[19:33:02] <letrec> я видимо чего-то не догоняю
[19:33:06] <letrec> или туплю
[19:33:41] <f[x]> одинаковый
[19:33:56] <letrec> да ты прав
[19:33:57] <gds> toplevel to the rescue!111
[19:34:29] <letrec> и что этот пример иллюстрирует?
[19:35:06] <f[x]> и чтобы добить :) - стрелка в декларации типа ассоциативна вправо!
[19:35:20] <f[x]> ну так неинтересно - поиграйся сам с примером в топлевеле
[19:35:26] <f[x]> асм посмотри который генерится
[19:38:33] <gds> или можно хотя бы сделать в топлевеле
let g = f 123;;
let h = g 234;;
[19:39:08] <letrec> поигрался
[19:39:17] <letrec> красивый прикол :)
[19:39:48] <letrec> сайд эффект на разных стадиях происходит
[19:40:07] <letrec> gds: так именно и сделал
[19:41:05] bobry- вышел(а) из комнаты
[19:41:10] <letrec> сайд эффекты всё сильно усложняют
[19:44:21] <gds> прикол красивый, только лучше аккуратнее с таким, насколько возможно.  А именно, желательно указывать в документации, что применение первых n аргументов можно сделать отдельно и в этом есть смысл (например, хотя бы, выделить скобками: "int -> (int -> int)").  Например, может оказаться так, что после применения первого аргумента уже можно создать какую-нибудь тяжеловесную внутреннюю структуру данных, которая будет использоваться при полном применении.  И в этом есть профит (в том, что есть различия): где-то выгоднее создать структуру данных на один вызов, где-то -- каждый раз отдельную создавать.
[19:45:36] <gds> тьфуты, криво рассказал, но, надеюсь, понятно.
[19:47:22] <letrec> понятно, что имел в виду
[19:47:42] <f[x]> за примером можно смотреть netstring
[19:47:54] <letrec> но мне кажется это стрёмной практикой
[19:47:54] <f[x]> Netconversion из netstring
[19:48:03] <letrec> видимо из-за недостатка опыта
[19:49:04] <gds> думаю вот, надо бы какой-то явный конструктор выписать, типа
partapp int (int -> int)
, равный, например
type partapp 'a 'b = 'a -> 'b
[19:49:23] <letrec> т.е. выглядит как оптимизация завязанная на тонкий момент
[19:49:46] <letrec> т.е. обычно предполагаешь, что полное применение дешевле
[19:49:53] <letrec> а тут наоборот получается
[19:50:04] <gds> ну, хотя бы есть возможность такой оптимизации, это в целом хорошо.
[19:51:14] <letrec> т.е. если надо вызвать фнункцию n раз и вызовы отличаются только не первыми аргументами, то частичное применение может дать профит?
[19:55:42] <gds> да.
[19:56:41] <letrec> прочитал про Netconversion - это распространённая техника?
[19:57:06] <gds> можно поизвращаться с приватными типами: http://paste.in.ua/2993/
[19:59:52] <letrec> вот ты пишешь let () = print_endline "Q" in вместо print_endline "Q";
[20:00:17] <letrec> это чисто вопрос вкуса или есть ещё какие-то соображения?
[20:00:29] <letrec> типа кошерней?
[20:00:42] <letrec> более аппликативно?
[20:03:32] <gds> больше гарантий, см. https://github.com/camlunity/kamlo_wiki/blob/master/OCamlFAQ.md (вопрос 3).
кроме того, гораздо легче натыкивать в тело функции: для любого выражения E имеем, что let () = some sideeffects in E будет делать то, что надо, без добавления скобок и нарушения выравнивания исходников, сравнить с:
let f x =
  E
->
let f x =
  ( some sideeffects
  ; E
  )
[20:04:52] <gds> кстати, а мне внезапно взял и понравился Partapp.  Буду использовать его в коде, ща присуну в amall (солянка тем вкуснее, чем больше в неё накидано).
[20:06:11] <letrec> по поводу Netconversion подумалось следующее
[20:07:11] <letrec> я бы вынес тяжёлое вычисление по первому аргументу в отдельную функцию и требовал её результат в качестве параметра
[20:07:30] <letrec> если тип сцыкотно выставлять, то его можно сделать абстрактным
[20:08:10] <letrec> таким образом фуекцию можно эффективно использовать не читая доку (я доку без острой необходимости никогда не читаю)
[20:09:05] <letrec> и такое решение как мне кажется более соответствует духу языка - всё по-возможности явное
[20:09:14] <letrec> что скажете?
[20:09:29] shaggie вышел(а) из комнаты
[20:10:22] <gds> в этом тоже есть хороший смысл, скорее уважаю.  Но partapp -- тоже решение -- простое, самодокументирующееся.
[20:20:08] <letrec> Partapp для меня пока черезчур хардкорно - до private types я ещё не добрался
[20:20:44] <gds> в качестве "просто пользовать" -- ничего экстремального там.
[20:21:03] <letrec> просто пользовать не понимая не интересно
[20:21:26] <letrec> а вот let () = print_endline "Q" in это красиво - не надо засорять голову частными случаями
[20:22:38] <gds> и для отладки тоже зачотно -- в любую строку let .. in вписывается, так же легко эта строка комментируется при нужде.
[20:23:27] <letrec> ага - делает код проще в изменении и отладке
[20:25:06] <letrec> а оверхед у Partapp есть?
[20:30:35] <gds> по идее -- нет оверхеда по сравнению с чистыми make + apply, которые без приватных типов (решил их не сокращать в amall).  А у них самих -- make = %identity (по идее, компилятор соптимизирует).  apply -- value apply f x = f x -- по идее, самое страшное, это скомпилируется в вызов функции модуля.
[20:49:14] Typhon вышел(а) из комнаты: Replaced by new connection
[20:49:15] Typhon вошёл(а) в комнату
[20:51:54] <gds> кажется, придумал кое-что про embedded dsl -- кому-нибудь что-то подобное делать надо [будет]?  интересно было бы обкатать на реальном примере, а не в теориях, а примера у меня пока не предвидится.
[20:52:04] letrec вышел(а) из комнаты
[20:53:20] <gds> (собственно, ничего экстраординарного и даже умного -- я вам не олег, всё-таки.)
[21:21:49] <Typhon> о, может быть есть пример, но я только низ прочитал, пойду до дома, перечитаю полностью, сообщу %)
[21:21:52] Typhon вышел(а) из комнаты
[21:37:34] <gds> komar: ональных извращений заказывали?  http://gdsfh.dreamwidth.org/10937.html
[21:38:52] <bobry> о как
[21:41:33] <gds> на видео комара про конкурс мокрых рубашек мне захотелось как-нибудь адекватно ответить, тоже подарить кусочек радости :]
[21:44:54] zert вышел(а) из комнаты
[22:22:42] ftrvxmtrx вышел(а) из комнаты
[22:23:58] ftrvxmtrx вошёл(а) в комнату
[22:53:35] Typhon вошёл(а) в комнату
[23:04:48] iNode вышел(а) из комнаты
[23:31:12] ermine вышел(а) из комнаты
[23:57:50] chups вошёл(а) в комнату
[23:59:32] chups вышел(а) из комнаты