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 вышел(а) из комнаты