Home
Objective Caml
ocaml@conference.jabber.ru
Пятница, 12 ноября 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:02:31] komar вошёл(а) в комнату
[00:03:00] <ygrek> угу
[00:09:45] ʇsʎɯ вышел(а) из комнаты
[01:05:33] komar вышел(а) из комнаты
[01:19:52] ygrek вышел(а) из комнаты
[01:20:56] ygrek вошёл(а) в комнату
[01:30:14] ermine вышел(а) из комнаты
[01:37:31] arhibot вышел(а) из комнаты
[01:37:56] Kakadu вышел(а) из комнаты
[01:40:24] Typhon вышел(а) из комнаты
[01:42:54] ygrek вышел(а) из комнаты
[02:39:18] zert вышел(а) из комнаты
[06:57:37] f[x] вышел(а) из комнаты
[06:58:20] f[x] вошёл(а) в комнату
[09:00:10] SerP вошёл(а) в комнату
[09:02:22] gds вошёл(а) в комнату
[09:16:46] SerP вышел(а) из комнаты
[09:23:16] iNode вышел(а) из комнаты: Replaced by new connection
[09:23:16] iNode вошёл(а) в комнату
[09:58:47] SerP вошёл(а) в комнату
[12:01:31] Typhon вошёл(а) в комнату
[12:01:35] Kakadu вошёл(а) в комнату
[12:16:32] ermine вошёл(а) в комнату
[12:24:38] komar вошёл(а) в комнату
[12:33:45] Kakadu вышел(а) из комнаты: I'm happy Miranda IM user. Get it at http://miranda-im.org/.
[12:33:52] Kakadu вошёл(а) в комнату
[12:35:37] Mon вышел(а) из комнаты
[13:18:04] zert вошёл(а) в комнату
[13:44:18] Mon вошёл(а) в комнату
[13:47:25] <Kakadu> https://github.com/Kakadu/Triss/blob/master/haxe/type.ml
тут вначале есть рекурсивныё тип на 150 строчек. Разумно ли для такого типа писать обобщенную функцию его обхода?
[13:50:05] <komar> У меня сейчас в коде велосипедный язык, стейтменты которого обходятся с помощью объекта visitor.
[13:51:04] <komar> И у объекта методы типа:
method visit_decl : decl -> decl visit_action
method visit_exp : exp -> exp visit_action
[13:52:09] Mon вышел(а) из комнаты
[13:52:13] <Kakadu> т.е. для 15 типов надо написать 15 фанок?
[13:52:18] <komar> type 'a visit_action =| SkipChildren | DoChildren | ChangeTo of 'a | ChangeDoChildrenPost of 'a * ('a -> 'a)
[13:52:29] <komar> И в итоге получается фигня полная, никогда так не делай.
[13:53:08] <f[x]> camlp4mapgenerator
[13:54:27] Mon вошёл(а) в комнату
[13:54:42] <komar> Kakadu: ну, если тебе нужно заменить один exp во всем коде, то ты создаёшь объект, делаешь inherit nop_visitor (который заглушка), пишешь один метод visit_exp, затем натравливаешь его на дерево.
[13:56:28] <f[x]> http://thedeemon.livejournal.com/20114.html?thread=206226#t206226
[14:06:38] Mon вышел(а) из комнаты
[14:10:44] <gds> тут у нас все умные, поэтому спрошу штуку про грамматики.  Вот, допустим, интересующий меня кусок грамматики для выражений (e -- сокращение от expression):
e ::= число | строка | идентификатор
| e(e) | e(e, e)  --  вызовы функций
| (e)  --  группировка скобками
| (e, e)  --  создание тупла
Как подозреваю, тут возможны конфликты.  Или их нет?
[14:17:50] Kakadu сомневается что это LL(1), но это наверное не важно
[14:21:56] Kakadu просит не принимать его в серьёз, он неадекватен сейчас
[14:26:10] <Typhon> yacс не ругается на правило :)
[14:29:15] <gds> Typhon: о, ты накодил?  Если да, можешь показать?
[14:31:41] <Typhon> наговнокодил, в пример от ply кинул, который под рукой был. питон -- http://paste.in.ua/1386/
[14:35:22] <gds> благодарю.  Попробую запустить, поиграюсь.
[14:36:32] <Typhon> только у тебя 1(1, 1) распарсится ок, например
[14:39:01] <gds> ага, это приемлемо.  По типам не сойдётся, и всё.
[14:41:20] <gds> "ImportError: No module named ply.lex".  Забью.  Но в общем идею понял.  Вроде конфликтов нет, но хотел уточнить.  А то у меня моск замыленный (а не только глаз).
[14:42:00] <Typhon> и на глаз тоже вроде всё ок, да (ply ставить надо, у меня он используется в работе, поэтому рядом есть :-) )
[15:00:26] Mon вошёл(а) в комнату
[15:13:54] ʇsʎɯ вошёл(а) в комнату
[15:51:28] <Kakadu> f[x]: А можно поподробнее про смысл на пост ссылки ygrek'a?
[15:51:39] <Kakadu> f[x]: для какой версии камла это ?
[15:53:48] <f[x]> для любой
[15:54:02] <f[x]> смысл в том что визитор для развесистого типа не нужно выписывать руками
[15:55:09] <gds> думал, что Camlp4Filters.GenerateMap появилось в 3.12.
[15:55:32] <Kakadu> скорее метод lvaluе там появился
[15:55:51] <Kakadu> я не понимаю в какой смошке это находится
[15:56:22] <f[x]> map/fold-generator есть минимум с 3.10
[15:56:41] <f[x]> lvalue не в cmo'шке, это сгенерированный
[15:56:55] <f[x]> возьми тот пример, скомпиляй и посмотри что генерится - станет понятней
[15:57:16] <Kakadu> я и компиляю тот пример
[15:57:19] <Kakadu> не компиляется
[16:00:57] <Kakadu> http://paste.org.ru/?hslypq
идеи?
[16:01:27] <f[x]> ну так там и нет lvalue
[16:01:41] <f[x]> если ты посмотришь оригинальный пример то там есть type lvalue = ...
[16:04:03] <f[x]> http://paste.org.ru/?6vsirb
[16:07:42] <Kakadu> Ура, просветление!
[16:08:13] <Kakadu> осталось понять как это использовать для go to definition
[16:15:42] Mon вышел(а) из комнаты
[16:16:30] ʇsʎɯ вышел(а) из комнаты
[16:16:43] ʇsʎɯ вошёл(а) в комнату
[16:21:45] ʇsʎɯ вышел(а) из комнаты
[16:21:59] ʇsʎɯ вошёл(а) в комнату
[16:26:33] ʇsʎɯ вышел(а) из комнаты
[16:26:49] ʇsʎɯ вошёл(а) в комнату
[16:26:54] ʇsʎɯ вышел(а) из комнаты
[16:27:03] ʇsʎɯ вошёл(а) в комнату
[16:28:30] ʇsʎɯ вышел(а) из комнаты
[16:34:42] ʇsʎɯ вошёл(а) в комнату
[16:35:02] ʇsʎɯ вышел(а) из комнаты
[16:36:05] <komar> oh god, как мне выбрать любое значение из Hashtbl.t?
[16:36:46] ʇsʎɯ вошёл(а) в комнату
[16:37:59] <f[x]> iter + raise
[16:38:12] <komar> Грязно.
[16:38:24] <komar> А, не.
[16:38:25] <gds> зато работает и быстро.
[16:38:26] <komar> Ну да.
[17:26:09] Mon вошёл(а) в комнату
[17:32:40] gds вышел(а) из комнаты
[17:43:28] Typhon вышел(а) из комнаты
[17:44:25] Typhon вошёл(а) в комнату
[18:18:07] <Kakadu> а |> в camlp4o есть или нечто пайп-подобное?
[18:20:55] <Kakadu> ладно, сам определю)
[18:26:35] Kakadu вышел(а) из комнаты
[18:42:30] gds вошёл(а) в комнату
[18:43:35] iNode вышел(а) из комнаты
[18:46:33] <gds> Kakadu: http://gdsfh.dyndns.org/kamlo/InfixOperators -- там выбрали ">>" в качестве такого оператора.
[18:51:03] <ʇsʎɯ> "Note that you can specify the directory names where the data files will be installed, **but you cannot rename the data files themselves."**
[18:51:07] <ʇsʎɯ> РРРРРРРРРРРРРРОООООООООООО
[19:17:09] <ʇsʎɯ> ой, простите
[19:17:11] <ʇsʎɯ> это я не туда
[19:23:57] Typhon вышел(а) из комнаты
[19:31:11] SerP вышел(а) из комнаты
[19:58:19] ʇsʎɯ вышел(а) из комнаты
[20:05:52] <gds> попробовал составить таблицу (state * input) -> (state * output) для тупой грамматики.  Понял, что говнокодить свой yacc -- слишком унылая перспектива.  Хочу попробовать какие-то бестабличные алгоритмы, пусть и медленные.  Есть что-нибудь на примете?  Ну, понятно, можно идти по правилам и смотреть их применимость, а где надо, составлять список возможных применимых правил, фактически, вырождаясь до комбинаторных парсеров.  Не знаю, в общем.
[20:06:18] <gds> хорошо что это не моя непосредственная работа, а то такие фейлы ловить как-то неприлично.
[20:06:32] zert вышел(а) из комнаты
[20:25:41] ygrek вошёл(а) в комнату
[20:37:58] Typhon вошёл(а) в комнату
[20:43:19] komar вышел(а) из комнаты: Logged out
[20:43:22] komar вошёл(а) в комнату
[21:48:54] Kakadu вошёл(а) в комнату
[22:15:02] komar вышел(а) из комнаты
[22:42:32] <Typhon> http://caml.inria.fr/pub/ml-archives/caml-list/2010/11/da955c6e391909a92e07b90dde5f39ab.en.html
[22:50:14] <ygrek> ещё бы понять что это
[23:07:37] <gds> почитал https://sites.google.com/site/ocamlgadt/ , примерно понятно, но смутно.  С другой стороны, мой подход к ним сейчас -- как подход императивщиков к sum types: примерно понятно, но нет никакой интуиции, где это дело применять, а где нет.
Ещё, как я понял, конструкторы добавляют ограничения на типы, кагбэ добавляя уравнение в унификацию.  Например, Pair 'a t * 'b t -> ('a * 'b) t равносильно функции типа make_pair : 'a t * 'b t -> ('a * 'b) t, то есть, применяя конструктор, на его аргументы и на результат накладывается ограничение унификации, которое наложило бы применение функции с такой сигнатурой.  Отличие от обычных sum types, как я вижу, в том, что 1. все конструкторы универсальны по отношению к результату (например, Int of int выдаст тот же 'a t, а не int t), 2. возможны уравнения, связывающие типы аргументов и типы результата (это частный случай п.1) (и это видно в типе Pair).
Для конструкторов всё можно заменить на функции, создающие нужные значения.  Для паттерн-матчинга, как прикидываю, нужно Олеговское решение со "значением-свидетелем".  Интересно, гоню ли.
[23:20:37] <gds> "Отличие от обычных sum types, как я вижу, в том, что 1. все конструкторы универсальны по отношению к результату"
-- уточню, "в том, что все конструкторы в sum-types универсальны [..], в отличие от gadts, где тип аргументов может влиять на тип сконструированного значения".
[23:32:00] <gds> хорошая штука этот "Shunting Yard algorithm".  Без таблиц, тупой, работает с приоритетами и ассоциативностями операторов.  Только вот два рядом стоящих нетерминала не умеет, бида-бида.  Оно может и не понадобится, но такую штуку заранее не угадаешь.
[23:36:18] ygrek вышел(а) из комнаты
[23:37:04] ygrek вошёл(а) в комнату
[23:53:31] serp256 вошёл(а) в комнату
[23:58:47] komar вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!