Home
Objective Caml
ocaml@conference.jabber.ru
Понедельник, 1 ноября 2010< ^ >
ygrek установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap | judge by commits, not comments | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+3
[00:03:23] ygrek уже всё сказал, идея утопична и nihилистична
[00:06:22] myxomop87 вошёл(а) в комнату
[01:17:08] myxomop87 вышел(а) из комнаты
[01:36:38] ygrek вышел(а) из комнаты
[02:11:30] ermine вышел(а) из комнаты
[03:13:22] zert вышел(а) из комнаты
[03:40:34] Typhon вышел(а) из комнаты
[07:39:08] iNode вошёл(а) в комнату
[09:57:03] gds вошёл(а) в комнату
[10:11:34] serp256 вошёл(а) в комнату
[10:16:43] ygrek вошёл(а) в комнату
[10:33:47] <gds> испытываю неудобства в ocaml-iteratees, когда с каждым io-исключением таскаю место, где оно возникло (т.е. тупл exn*string).  Выпилить, что ли, этот "*string" и запилить потом, в случае явной нужны?..
[10:33:56] <gds> *нужды
[10:39:41] arhibot вошёл(а) в комнату
[10:42:17] komar вышел(а) из комнаты
[11:00:09] ygrek вышел(а) из комнаты
[11:00:53] ermine вошёл(а) в комнату
[11:10:39] Mon вышел(а) из комнаты
[11:12:59] myxomop87 вошёл(а) в комнату
[11:42:19] zert вошёл(а) в комнату
[12:09:28] Typhon вошёл(а) в комнату
[12:10:49] arhibot вышел(а) из комнаты
[12:11:11] komar вошёл(а) в комнату
[12:31:44] aloner2k вошёл(а) в комнату
[12:56:45] aloner2k вышел(а) из комнаты
[13:18:59] <f[x]> http://codepad.org/sw0OnZYF
[13:19:19] <f[x]> mfp подкинул wtf по value restriction в irc
[13:21:51] komar в который раз пишет код, который под x86_64 нифига не работает.
[13:22:00] <komar> Надо валить на х-ль.
[13:33:21] <gds> f[x]: ну по идее, если есть какой-то вызов функции при конструировании top-level value, оно не будет полиморфным.  Слегка wtf чувствуется, но при обдумывании проходит.
[13:35:08] arhibot вошёл(а) в комнату
[13:40:49] <f[x]> ыы??
[13:42:02] <gds> # let q = (fun x -> x);;
val q : 'a -> 'a = <fun>
# let w = let () = print_string "kva\n" in (fun x -> x);;
kva
val w : '_a -> '_a = <fun>
[13:42:53] <gds> в том числе, когда вызов функции возвращает часть или полное значение:
# let e = List.map (fun x -> x);;
val e : '_a list -> '_a list = <fun>
[13:43:23] <f[x]> т.е. поинт в том что это значение содержит унутре функции
[13:43:40] <gds> вызовы, точнее.
[13:43:52] <f[x]> т.е. если значение "обычное" то в toplevel можно делать что угодно - всё равно полиморфно
[13:44:04] <f[x]> нет, я имею ввиду само toplevel значение - это функция
[13:44:22] <f[x]> если не функция (и не ref) - то всё ок
[13:44:23] <gds> не, причина в том, что для конструирования требуется вызов.
[13:44:36] <f[x]> let x = let _ = ignore (print_endline "qq") in [];;
[13:44:48] <f[x]> let x = let _ = ignore (print_endline "qq") in (fun x -> x);;
[13:45:41] <gds> пустой список ок, потому что то ли простой конструктор, то ли что-то с ковариантностью (шоке).  почитаю про value restriction и про гарриговские relax'ы к нему, интересно.
[13:47:32] <f[x]> вот только не надо про ковариантность!
[13:47:45] <f[x]> осталось понять почему всё-таки так?
[13:48:01] <f[x]> ну и что что сайд-эффекты - результат функции-то не используется
[13:58:16] <gds> конечно, результат не используется.  могли бы сделать и так, чтобы в подобных случаях не ограничивались типы.  однако, если результат не используется, почему бы не вынести вызов в другое top-level value.
[14:00:11] <f[x]> и в данном конкретном случае это вообще не помогает
[14:03:45] Mon вошёл(а) в комнату
[14:04:02] <gds> f[x]: вот так -- http://codepad.org/8hIGzxdP -- помогло.
[14:07:03] <f[x]> да, ты прав, спасибо
[14:07:16] <f[x]> можно отдельно сделать let cache = Some (f ())... и потом
[14:07:24] <f[x]> ешл использовать
[14:07:32] <f[x]> * его использовать
[14:08:52] <f[x]> garrigue продоолжает зажигать -> "A Certified Implementation of ML with Structural Polymorphism", November, 2010
[14:08:59] <f[x]> с coq скриптами
[14:09:56] <gds> воистину жжот, если с coq.
[14:13:25] Mon вышел(а) из комнаты
[14:23:34] Mon вошёл(а) в комнату
[14:24:16] komar вышел(а) из комнаты
[14:32:17] komar вошёл(а) в комнату
[14:40:31] <gds> думаю вот.  Если хочется "как у взрослых" определять операторы (префиксные, инфиксные, постфиксные, в том числе из букв) (с приоритетами как в coq, например: "(at level 80, right associativity)", и с операторами как в окамле всякие not/land/lor), это лучше расхотеть?  Или же придётся только базовую разборку делать в разных там ocamlyacc/menhir, а остальное (в пределах оператора/выражения) разбирать руками, согласно заданным операциям?
[14:55:43] Kakadu вошёл(а) в комнату
[15:11:23] ʇsʎɯ вошёл(а) в комнату
[15:12:24] ʇsʎɯ вышел(а) из комнаты
[15:12:32] ʇsʎɯ вошёл(а) в комнату
[15:42:17] <f[x]> http://lambda-the-ultimate.org/node/4094#comment-62100
[15:43:12] Typhon ненавидит комменты на ltu :)
[15:46:12] <gds> это не коммент, это гигантская статья.  Как только они умудрились её засунуть в комментарий?...
[15:52:35] <Typhon> я только вчера еще такого же размера читал
[15:52:47] komar вышел(а) из комнаты
[15:53:44] <Typhon> и самое отстойное, что там дальше дискуссия, с ответами, примерно того же размера
[15:57:56] <gds> прикидываю, как делать расширяемую грамматику.  У меня есть скобки (круглые, парные.  у лисперов спёр давно ещё, лежат вот.).  Каждое выражение у меня начинается и заканчивается круглой скобкой, а то и раньше.  Следовательно, имея список правил, касающихся синтаксиса, и список базовых правил (вызов функций, например), я могу просто идти по выражению, не содержащему скобок, слева направо, искать операцию с максимальным приоритетом, искать операции, с которой она ассоциативна, создавать один или несколько узлов синтаксического дерева, каждый из которых заполнять рекурсивно, разбив исходное выражение на куски, отделённые операторами.  Какой-то извращённый вариант парсинга, очевидно тормознее, чем классические, но расширяемость тут очень простая: добавляем в список операций ещё одну операцию и всё.
[16:40:50] ygrek вошёл(а) в комнату
[17:06:29] iNode вышел(а) из комнаты
[17:09:44] ygrek вышел(а) из комнаты
[17:09:55] ygrek вошёл(а) в комнату
[17:26:56] ygrek вышел(а) из комнаты
[17:30:19] gds вышел(а) из комнаты
[18:12:09] Kakadu вышел(а) из комнаты
[18:15:23] gds вошёл(а) в комнату
[18:39:22] arhibot вышел(а) из комнаты
[18:46:20] serp256 вышел(а) из комнаты
[18:53:24] komar вошёл(а) в комнату
[19:07:51] komar вышел(а) из комнаты: Logged out
[19:08:30] komar вошёл(а) в комнату
[19:12:20] Kakadu вошёл(а) в комнату
[19:16:15] Typhon вышел(а) из комнаты
[20:26:03] komar вышел(а) из комнаты
[20:40:27] Typhon вошёл(а) в комнату
[21:03:06] <gds> представим, что есть грамматика, где каждый оператор бывает пре/ин/пост-фиксным с указанным приоритетом и ассоциативностью.  Представим, что хочется использовать ";" и как разделитель, и как завершающий символ в последовательности команд.  Можно ли так определить ";", чтобы оба варианта -- ( a(); b() ) и ( a(); b(); ) -- парсились одинаково и преобразовывались в оператор ";", применённый к a() и b()?
Сходу -- объявить вдобавок к инфиксному-левоассоциативному ";" ещё постфиксный ";", с приоритетом чуть ниже, и равный identity, т.е. "( a(); b(); )"  =>  (Seq "a()" "b();") => (Seq "a()" (identity "b()")) => (Seq "a()" "b()").
В общем, идея описать весь синтаксис выражений в виде штуки, определяемой в рантайме, мне нравится всё больше и больше, но надо подумать.
[21:04:51] <Kakadu> настала пора в чатике, когда gds будет писать длинные сообщения и выносить мне мозг)
[21:07:59] <Typhon> а разная ассоциативность и, тем более, приоритеты -- реально нужны?
[21:14:21] <gds> Kakadu: ох.  Я постараюсь что-то с этим сделать.
Но жыжыца -- не то.  А тут меня хоть потравить могут, когда откровенную чушь пишу.
[21:17:13] <gds> Typhon: если делать расширяемую грамматику -- как мне кажется, нужны.  Для арифметики всякой, например.  Сложения, умножения, степени.  Ну и моя давняя идея-фикс -- возможность переопределить ";" оператор :)  То есть, специальных правил для него вводить не хочу.  А если рассматривать посредством общих правил -- то вот как-то так только получается сделать его и разделяющим, и завершающим, хоть и криво.
Можно брать за базу не классические пре/ин/пост-фиксные, а что-то другое, но легко-описысваемое и простое.  (кроме BNF, коии парсить не хочу сходу.)
[21:27:03] <Typhon> есть мнение, что ты очень сложную задачу рискуешь себе поставить: мало того, что с кодогенерацией не всё ясно, как я понимаю, так и парсер тебе придётся со всей это штукой накручивать %) ( btw, вспомнился Pi -- http://www.pi-programming.org/What.html -- тебе никак ща не пригодится? )
[21:32:32] <Typhon> ( елси бы я писал сейчас язык свой, то я бы спёр синтаксис у q (предков я его не знаю). left-of-right вычисление, нет вопросов приоритетов и ассоциативности. но хз как на задачи ложиться)
[21:32:48] <Typhon> btw, кажется новое: https://code.kx.com/trac/wiki/KdbplusForMortals/contents
[21:36:14] <gds> да, про сложность думал.  чорт, трудно быть идеалистом.
свой парсер описывал сегодня днём в чятик, тупаковый он будет, тот, который будет выражения парсить.  А вот остальное (типы, объявления) -- menhir буду брать, тут выдумывать мне нечего.
кодогенерацию пока в js только, этим я себе упрощаю задачу.
Pi -- читаю, идея оригинальная, обязательно пойму принципы.  Не так, так эдак пригодится.
Про q -- у меня одна из целей в том, чтобы сишников некоторых подсадить на хорошее (типичные пушинг/драгдилерство), а вот q мне не влезает в голову (не влезал, когда пробовал).  Буду пробовать ещё, но не прямо сейчас, раз хвалишь за предсказуемость.
[21:43:10] <gds> а, забыл, чего это я вообще "выступал" тут с грамматикой, ";" и приоритетами.  Вопрос такой: по идее, почти всё (даже концевую ";"!) можно описать операциями-ассоциативностями-приоритетами.  А что нельзя?
Сходу, например, если буду делать for-циклы, то их надо будет встраивать относительно глубоко, так как в первой их "секции" будут в том числе определения переменных, которые генерить не получится нормально (это не совсем выражения).  Макросы делать -- тут я точно закопаюсь напрочь, неохота.  Да и получится так, что ";" внутри описания цикла for(..) и вне него будет иметь разное значение (в for(..) это будет не описание последовательности).
[21:45:07] <Kakadu> внутри описания - это в скобках типа как int i=0;i<4;++i ?
[21:45:14] <gds> да
[21:46:13] <gds> то есть, если захочется классический синтаксис for, с помощью одних только переопределений операторов это получится не очень хорошо, так как надо будет как минимум объявлять переменную i, действующую в "i<4", "++i" и в теле цикла.
[21:46:35] <Kakadu> можно временно отложить эту проблему, заставив вместо ; писать скобочки а ля лисп. и потом к этому вернуться
[21:47:14] <Kakadu> можно парсить for как попала, а в AST его держать как while
[21:47:40] <gds> идею понял.  Пока так и думаю, захардкодить ";" либо "for".  Про макросы -- не знаю, сложно.  С другой стороны, compile-time вычисления таки надо будет кодить, но тоже не прямо сейчас.
[21:48:04] <gds> про for -- понял.  парсим как predefined, while тоже имеем predefined, и преобразовываем for => while.
[22:08:13] arhibot вошёл(а) в комнату
[22:21:08] komar вошёл(а) в комнату
[22:33:39] gds вышел(а) из комнаты
[22:58:01] myxomop87 вышел(а) из комнаты
[23:03:42] Kakadu вышел(а) из комнаты
[23:04:53] komar вышел(а) из комнаты
[23:20:24] komar вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!