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

GMT+4
[00:01:35] <ermine> ну тут получается одним хопом могло быть меньше, поскольку уже есть код, использующий результат фолдов
[00:02:42] <ermine> второй фолд генерил тьюпл, так что наверное можно рекорд на первом фолде
[00:08:23] <gds> можно. кстати, список тут не очень, ибо небезопасно: в хреновом случае может расти до упора. запись/тупл не растут.
[00:10:02] <ermine> какие страсти
[00:13:36] ygrek вышел(а) из комнаты
[00:13:49] <gds> ога. А у меня были случаи, когда мой софт валили из внешнего интернета, и были гадкие разборки. В случаях публичного софта я предпочитаю следить за памятью так, чтобы она при внешних воздействиях не исчезала. окамл это позволяет, почему бы и не.
[00:16:53] <ermine> у меня списки валились только из-за оператора @
[00:17:24] sceptic вошёл(а) в комнату
[00:17:26] sceptic вышел(а) из комнаты
[00:17:31] sceptic вошёл(а) в комнату
[00:18:31] <gds> я бы сказал "всё впереди" в других обстоятельствах.
[00:22:00] sevenov вышел(а) из комнаты: Replaced by new connection
[00:22:03] sevenov вошёл(а) в комнату
[00:53:38] ermine вышел(а) из комнаты: Replaced by new connection
[00:53:39] ermine вошёл(а) в комнату
[01:25:07] 604 вышел(а) из комнаты
[02:01:20] sceptic вышел(а) из комнаты
[02:14:47] sevenov вышел(а) из комнаты
[02:15:05] sevenov вошёл(а) в комнату
[02:45:34] gds вышел(а) из комнаты
[03:10:06] DiGiTAL_CuRSe вышел(а) из комнаты
[03:46:59] sevenov вышел(а) из комнаты
[03:47:21] sevenov вошёл(а) в комнату
[04:02:59] daapp вошёл(а) в комнату
[04:23:09] daapp вышел(а) из комнаты
[04:23:41] daapp вошёл(а) в комнату
[04:35:00] sevenov вышел(а) из комнаты
[04:35:49] sevenov вошёл(а) в комнату
[05:32:29] john вошёл(а) в комнату
[06:12:05] sevenov вышел(а) из комнаты
[06:12:08] sevenov вошёл(а) в комнату
[06:21:41] sevenov вышел(а) из комнаты
[06:22:01] sevenov вошёл(а) в комнату
[07:01:59] john вышел(а) из комнаты: Replaced by new connection
[07:02:00] john вошёл(а) в комнату
[07:18:49] sevenov вышел(а) из комнаты
[09:04:12] gds вошёл(а) в комнату
[09:32:50] Typhon вошёл(а) в комнату
[10:51:07] f[x] вошёл(а) в комнату
[10:55:33] ygrek вошёл(а) в комнату
[11:10:30] <Typhon> Привет, какой синтаксис рекомендовано использовать -- оригинальный или revised?
[11:10:52] <gds> зависит от многого.
[11:11:23] <Typhon> например?
[11:11:36] <Typhon> насколько широко revised используется?
[11:12:53] <gds> revised -- используется как факт. Минусы -- под него нет иде (емакс/вим, все дела), им плохо общаться с людьми (в частности, когда совместный проект), иногда кривовато работают синтаксические расширения (но это мало критично). Остальное -- сугубо плюсы.
[11:17:10] <Typhon> ясно, спасибо :)
[11:19:26] <gds> знать original syntax -- просто обязательно. а там уже не сложно переключаться между ними, если есть желание кодить для себя в revised и для внешнего мира в original. кроме того, конвертятся легко.
[11:19:47] <Typhon> да, я тоже на этом остановился
[11:19:56] <Typhon> тем более там различий -- две страницы
[11:20:33] <Typhon> а не в курсе, кто-нибудь tuareg ковыряет на предмет работы с revised?
[11:21:02] <gds> ага. Но они в последнее время приближают revised к original. инфиксные операторы переняли, последовательности операторов.
tuareg -- не в курсе.
[11:36:44] <f[x]> http://community.livejournal.com/ru_lambda/107847.html
[11:59:43] <ermine> а что там крутого?
[12:00:22] <ermine> явно не про рульный и глючный ocsigen
[12:01:18] <f[x]> ocsigne таки глючный?
[12:01:29] <f[x]> из-за lwt?
[12:01:55] <ermine> ну вот тот же lwt непашыт как следует
[12:02:31] <ermine> а я из-за полных переделок сульци отложила ocsigen в сторонку
[12:10:56] daapp вышел(а) из комнаты
[12:49:59] <gds> ололо, migmit про тайпклассы хаксиля: "В принципе, мне не кажется, что мы много потеряли бы, если бы согласились каждый раз указывать словарь явно; зато всю эту кучу можно было бы выкинуть."
ну, то есть, obj#print и все дела :)
[12:57:20] <f[x]> урлы
[12:57:56] <gds> http://thesz.livejournal.com/1010226.html?thread=8076082#t8076082
[12:58:22] ygrek вышел(а) из комнаты
[12:58:39] <gds> кстати, птсо и остальные каменты тоже хороши.
[13:04:17] <f[x]> угу
[13:04:34] <f[x]> ну а по камлю есть былинный тред why ocaml sucks :)
[13:06:16] <gds> который в caml-list или другой?
[13:09:33] <f[x]> угу
[13:09:37] <f[x]> кстати, что то с паралельным gc так ничего и не слышно, они его хоть зарелизили?
[13:10:11] <gds> не, молчат, гады.
[13:10:48] <f[x]> в рассылку помню что-то писали но
[13:10:55] <f[x]> без рабочих урлов вроде
[13:11:38] <ermine> а пчу камло сосет?
[13:12:15] <Typhon> http://www.google.com/search?hl=ru&q=why+ocaml+sucks
[13:14:37] <ermine> вон там "вариант типы в камле сосут" - это правильно
[13:15:13] <gds> f[x]: дада, "мы сделали поистине чудесную реализацию, но сообщения рассылки слишком узки для него"
[13:15:23] <gds> ermine: правильно сосут?
[13:16:50] <ermine> gds: я про то, что мнение правильное :P
[13:23:36] <gds> в какой точно статье это описано?
[13:24:25] <ermine> неважно в какой
[13:24:58] john вышел(а) из комнаты
[13:24:59] <gds> тогда не ясно, почему сосут. Лично мне вариантные типы очень нравятся. Одна из лучших вещей.
[13:25:44] <ermine> потому что они жестко не типизинуются?
[13:26:28] <gds> надо жесткие -- берём обычные вариантные, надо гибко -- берём полиморфные варианты.
[13:26:33] <ermine> если сравнить с erlang, то это - атомы, и там же они используются, потому что там нет типа sum
[13:27:36] <gds> а если сравнить с лиспом, то в окамле вообще вариантных типов быть не должно.
[13:28:35] <ermine> варианты - это ересь от лешего
[13:28:37] <ermine> :)
[13:30:25] <gds> ну да, надо как в плюсах, создавать класс, объект, дергать callback'и.
[13:30:49] <ermine> чаще всего я использовала варианты там где наступал конфликт в именах sum
[13:31:06] <ermine> но ведь это неправильно
[13:31:44] <gds> для того их и придумали, чтобы flat namespace. Не нравится -- имей namespace в пределах модуля и строгую типизацию.
[13:32:53] <ermine> это правильнее
[13:33:06] <ermine> а то бы давно то же самое сделали для имен полей рекордов
[13:33:23] <ermine> а то они продолжают конфликтовать
[13:33:52] <gds> ну а что мешает:
module A = struct type a = A | B end
module B = struct type b = A | C end
A.A
B.A
[13:34:45] <ermine> ну и зачем тогда нужны варианты?
[13:34:51] <f[x]> у вариантов есть очень полезное свойство
[13:35:34] <f[x]> возможность писать функции вида filter : [<`A;`B;`C] -> [<`A;`B]
[13:36:47] <ermine> фальшивая типизация :)
[13:36:55] <gds> очень удобная вещь.
[13:38:36] <gds> subtyping вообще шикарная вещь. да и возможность писать нехило расширяемый код.
[13:38:57] DiGiTAL_CuRSe вошёл(а) в комнату
[13:39:31] <gds> ещё одно свойство -- модули, использующие полиморфные варианты, не обязаны что-либо знать друг о друге вообще.
[13:39:44] <gds> для совместного использования.
[13:40:58] <gds> если в одном модуле объявлено type result 'a 'b = [= `Ok of 'a | `Error of 'b ], то другой модуль, использующий те же варианты (с теми же типами) будет нормально работать независимо от наличия первого модуля.
[13:42:00] <gds> ещё у кого-то (у Гаррига, что ли) было про инкрементальное написание эвалуатора выражения, тоже стоит почитать.
[13:44:07] <ermine> вот независимость модулей с одними и теми же вариантами - один из тяжких клинических случаев
[13:44:45] <gds> "пчу?" []
[13:44:51] <ermine> надо палюбому самому следить за типизацией, только уже собственными глазами
[13:46:55] <ermine> а если ты в одном модуле сделаешь type 'a 'b 'c result = | `Ok of 'a 'b | `Error of 'c и забудешь подправить в другом модуле
[13:46:58] <gds> для вещей, работа с которыми разная в зависимости от модуля, используются sum types, а в случаях одинаковой работы (верь, такое есть!) -- можно и полиморфные варианты.
[13:47:32] <ermine> забыла вставить звездочку
[13:47:44] <ermine> ладно, надо поцамлить немного
[13:47:52] <gds> тогда словлю прикол при разборе `Ok val. Причём при разборе val, т.к. сам вариант разберётся без проблем.
[13:55:35] <gds> кстати вот, вместо fastcgi советуют более простой scgi ( http://ru.wikipedia.org/wiki/SCGI ) -- интересно, ocamlnet умеет? или вообще scgi считается некошерным?
[13:55:56] <f[x]> умеет
[13:57:31] john вошёл(а) в комнату
[13:59:48] john вышел(а) из комнаты: Replaced by new connection
[13:59:49] john вошёл(а) в комнату
[14:23:11] gds вышел(а) из комнаты: Replaced by new connection
[14:23:12] gds вошёл(а) в комнату
[15:14:59] ygrek вошёл(а) в комнату
[15:25:25] Typhon вышел(а) из комнаты
[15:26:27] Typhon вошёл(а) в комнату
[15:41:38] abiogenesis вошёл(а) в комнату
[16:06:48] sevenov вошёл(а) в комнату
[16:09:44] john вышел(а) из комнаты: Replaced by new connection
[16:09:45] john вошёл(а) в комнату
[16:15:31] john вышел(а) из комнаты
[16:16:44] abiogenesis вышел(а) из комнаты
[16:17:45] sevenov вышел(а) из комнаты: Replaced by new connection
[16:17:46] sevenov вошёл(а) в комнату
[16:43:28] Typhon вышел(а) из комнаты
[16:46:28] Typhon вошёл(а) в комнату
[16:57:40] 604 вошёл(а) в комнату
[16:58:35] sevenov вышел(а) из комнаты: Replaced by new connection
[16:58:41] sevenov вошёл(а) в комнату
[16:59:26] <gds> caml-list:
"
from Alexander Danilov <alexander.a.danilov@gmail.com>
to caml-list@yquem.inria.fr
Richard Jones пишет:
[skip]
"
интересно, кто-то из наших?
[16:59:41] <gds> (понятно, что русский, т.к. см. шаблон в теле письма, я про жабберы всякие)
[17:03:58] ygrek вышел(а) из комнаты
[17:21:11] <f[x]> # let f g = g ~x:0 ();;
val f : (x:int -> unit -> 'a) -> 'a = <fun>
# let g ?(x=0) () = print_int x;;
val g : ?x:int -> unit -> unit = <fun>
# f g;;
Error: This expression has type ?x:int -> unit -> unit
but an expression was expected of type x:int -> unit -> 'a
[17:21:15] <f[x]> вызывает удивление
[17:21:21] <f[x]> и раздражает
[17:22:08] <f[x]> так что ли писать?
let f g = g ?x:(Some 0) ();;
[17:22:50] <gds> let g ?(x=0) () = print_int ~x
(не тестил)
[17:23:07] sceptic вошёл(а) в комнату
[17:24:05] <f[x]> у print_int нет label'ов :)
[17:33:56] <gds> кстати, ситуация явно косячная. ?x и ?(x=0) -- принципиально разные вещи.
[17:35:31] gds вышел(а) из комнаты
[17:50:50] Typhon вышел(а) из комнаты: Replaced by new connection
[17:50:59] Typhon вошёл(а) в комнату
[17:51:25] <f[x]> аргх http://www.math.nagoya-u.ac.jp/~garrigue/soft/olabl/lablgtk-list/old/319.txt
[18:00:07] Typhon вышел(а) из комнаты
[18:00:58] sceptic вышел(а) из комнаты
[18:01:18] sceptic вошёл(а) в комнату
[18:07:56] <ermine> f[x]: а чо ты ваяешь в lablgtk?
[18:09:35] ermine иногда дергается и пытается сваять на lablgtk клиента джаббера, но после возни с tree view быстро остывает
[18:11:48] <f[x]> рисовалка графиков
[18:13:17] <ermine> сетевых?
[18:13:23] <ermine> нагрузка?
[18:13:32] <ermine> загрузка?
[18:13:34] <f[x]> не
[18:14:05] <f[x]> данные какого-то техпроцесса, в dbf
[18:15:04] <ermine> а тебя еще не просили сделать симулятор этого техпроцесса?
[18:15:48] <f[x]> не
[18:16:50] <ermine> симулятор - это интереснее
[18:20:08] gds вошёл(а) в комнату
[18:20:11] <f[x]> хотел бы я писать только то что интересно :)
[18:21:36] <ermine> а как ты умудряешься при этом писать на камле?
[18:21:56] <ermine> обычно же требуют либо перл, либо плюсы какие-нить
[18:22:35] <ermine> типа для совместимости с другими разработчиками после того как тебя уволят
[18:22:40] <gds> иногда требуют результат :)
[18:23:27] <ermine> а вы оба чоле в одной конторе работаете?
[18:24:06] <gds> не. у меня свои работодатели бывают периодически, которым результат нужен.
[18:24:40] <gds> или редкость ситуации делает маловероятным наличие двух разных контор? :)
[18:25:16] <f[x]> конретно эта рисовалка для знакомого
[18:26:40] <ermine> а
[18:30:38] <ermine> а tree view ты там не мучаешь?
[18:32:18] <ermine> там у меня была проблема моментально найти строку в дереве и изменить ее состояние - перекрасить или передвинуть в дереве
[18:34:17] <f[x]> не, я пока еле осваиваюсь
[18:35:38] <ermine> я видела только два старых туториала по lablgtk, там ничего нового не появилось?
[18:39:04] <f[x]> не знаю что ты видела :), но там есть спец туториал по tree view вроде
[18:39:06] john вошёл(а) в комнату
[18:40:03] <ermine> ну он и есть
[18:40:34] <gds> f[x]: кстати, есть разгребалка dbf-формата. если ещё не нарисовал свою.
[18:40:58] <ermine> вон на ocaml-tutorial.org есть первый, который не про tree view
[18:41:52] <ermine> та еще рухлядь
[18:43:12] <f[x]> gds: планировал писать или биндиться. сейчас в csv конверчу сначала. что за разгребалка?
[18:45:27] <gds> писал утилитку, делающую dbf -> {create table,insert}, ну и обратные операции (обратные -- только с оракловским синтаксисом тех же дат, например). Не поддерживаю поля L (long?), булевые, мемо и вообще хитрые всякие. Не умею индексы, мемо.
[18:46:21] <f[x]> я даже слов таких не знаю :)
[18:46:26] <gds> щасте!
[18:46:28] <f[x]> на камле в виде либы?
[18:48:13] <gds> в виде проги. модульность уважаю, но читалка возвращает значения как строки. если надо, отрефакторю чуток, будет либа. Либо, если срочняк, подниму репо, сам отрефакторишь.
[18:48:37] <gds> а хотя, точнее скажу сейчас.
[18:48:57] <f[x]> репо оптимальней всего
[18:49:39] <f[x]> я не знаю когда мне это понадобится, но опубликовать код имхо не повредит
[18:49:55] sceptic вышел(а) из комнаты
[18:52:41] <gds> там интерфейс вида open / read_record : reader -> list string / close.
[18:53:41] <f[x]> ну сейчас csv я именно так и читаю :)
[18:57:23] <gds> да, надо выкладывать. интересно, на forge.ocamlcore.org дают нормальные репозитории (mercurial, на крайняк git)?
[18:58:10] sceptic вошёл(а) в комнату
[18:58:50] <f[x]> git дают
[19:00:02] <gds> ясно. тогда займусь.
но там у меня оно неполное и кое-где глючит. спишем на "альфа".
[19:01:03] <f[x]> ок
[19:12:32] <ermine> а кошерно ли делать let v = try Some ... with Not_found -> None in .. повсеместно?
[19:13:10] <gds> я так делаю часто.
в тех случаях, когда не делаю try `Ok (..) with ... -> `Error "shit, maam"
[19:13:22] <f[x]> let catch f x = try Some (f x) with _ -> None
[19:15:38] <ermine> f[x]: это другой вопрос, не про то как написать try with покороче :) к тому же в Printexc тоже есть catch
[19:16:52] ermine смотрит на код, в котором три try with и кучка матчингов
[19:17:02] <f[x]> развёрнутый ответ : да, так делать вполне кошерно, у меня для этого есть функа чтобы проще было делать это повсеиместно
[19:17:20] <ermine> вот это наличие горы матчингов портит красоту кода
[19:18:41] <ermine> надо чонить наподобие недавно изобретенного maybe
[19:19:44] <ermine> надо изобретать maydo
[19:25:18] <ermine> а вот с вышеуказанным catch есть неудобство в том, что аргумент не ленивый
[19:26:49] <f[x]> кто сказал что он не ленивый? ;)
[19:27:38] <f[x]> # fun f -> catch f (lazy 2);;
- : (int lazy_t -> 'a) -> 'a option = <fun>
[19:28:35] <ermine> это надо писать функцию, которая примет аргумент на хвосте
[19:28:57] <ermine> лучше бы catch (f x)
[19:29:56] <f[x]> скобок много
[19:31:02] <ermine> ну их меньше не станет в случае catch (fun x -> f x y) x
[19:36:19] f[x] вышел(а) из комнаты
[19:36:29] f[x] вошёл(а) в комнату
[19:36:35] <f[x]> для этого есть flip
[19:36:57] <f[x]> универсальных решений не бывает
[19:37:25] <f[x]> мне на практике такой catch удобен
[19:38:25] <ermine> а как flip выглядит?
[19:38:44] john вышел(а) из комнаты
[19:39:05] <f[x]> let flip f x y = f y x
[19:39:28] <ermine> а
[19:49:54] <gds> ой нет, только не поинт-фри.
[19:51:32] <f[x]> :)
[19:51:36] <f[x]> умеренно
[20:09:11] f[x] вышел(а) из комнаты
[20:14:13] ygrek вошёл(а) в комнату
[20:28:36] john вошёл(а) в комнату
[20:54:02] sceptic вышел(а) из комнаты: Replaced by new connection
[20:54:06] sceptic вошёл(а) в комнату
[21:00:43] sceptic вышел(а) из комнаты: Replaced by new connection
[21:00:43] 604 вышел(а) из комнаты
[21:00:52] sceptic вошёл(а) в комнату
[21:02:43] sceptic вышел(а) из комнаты: Replaced by new connection
[21:05:33] sceptic вошёл(а) в комнату
[21:52:25] <ermine> да, чтобы вообще написать какой-то код, надо просто начать его писать, даже если не понимаешь как писать код
[21:53:05] ermine за вечер неплохо продвинулась
[21:56:29] <gds> ещё помогает эвристика "а не хню ли я пишу?", которая намекает на необходимость переосмысления кода :]
[22:03:13] <ermine> ну я так и пишу - напишу несколько строк и перееделываю их
[22:06:26] <gds> метод в целом хороший, только "несколько строк" лучше ограничить интерфейсом и сместить эвристику в сторону "напишу несколько модулей и ..."
[22:18:22] <ermine> gds: не, я начинаю с разбора чего-нить, потом куда-нить разборщика дописываю, перепишу интерфейс к разборщику, перенесу его на полстраницы вверх или вниз, напишу еще один разборщик, посмотрю в документацию - подправлю кусок кода библиотеки разборщика и так далее
[22:18:53] <ermine> самое неприятное потом остается - как-то состыковать некоторые места
[22:19:10] <ermine> но это уже тогда, когда больше делать нечего
[22:25:10] <gds> ermine: ага, сам страдаю подобным. Помогает то самое fun _ -> raise Exit. Натыкаешь их куда ни попадя, интерфейс с типами вывел, и рисуешь _сверху_, а не снизу.
[22:25:29] <ermine> еще помогает компиляция
[22:25:41] <ermine> она покажет забытые места
[22:33:00] ygrek вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!