Home
Objective Caml
ocaml@conference.jabber.ru
Пятница, 28 мая 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+4
[00:30:15] digital_curse вышел(а) из комнаты
[01:26:05] ygrek вышел(а) из комнаты
[01:29:48] ermine вышел(а) из комнаты
[06:45:20] Typhon вышел(а) из комнаты
[08:06:27] iNode вошёл(а) в комнату
[08:13:09] serp256 вошёл(а) в комнату
[08:42:08] serp256 вышел(а) из комнаты
[09:01:44] gds вошёл(а) в комнату
[09:31:50] Typhon вошёл(а) в комнату
[10:08:21] serp256 вошёл(а) в комнату
[10:25:19] ʇsʎɯ вошёл(а) в комнату
[10:42:55] ermine вошёл(а) в комнату
[10:43:18] <ʇsʎɯ> > ermine вошёл в комнату
o_O
[10:44:14] <olegfink> предлагаешь "вошло"?
[10:46:57] <ʇsʎɯ> "вошла"
[10:47:06] <ʇsʎɯ> по крайней мере, я так думал...
[10:52:35] <ermine> вползло
[11:02:23] <ʇsʎɯ> перебирая ложноножками?
[11:11:29] Mon вошёл(а) в комнату
[11:19:23] <olegfink> нет, я к тому, как ты хочешь это реализовать
[11:19:45] <olegfink> здесь же все же не соцсеть, в jid пол не прописан
[11:33:43] <ʇsʎɯ> olegfink: это штука была
[11:33:54] <ʇsʎɯ> не стоит так серьёзно воспринимать
[11:34:26] <Typhon> "по утрам я не шучу"
[11:39:35] Kakadu вошёл(а) в комнату
[11:41:21] <f[x]> http://stackoverflow.com/questions/2917570/whats-the-revised-syntax-in-ocaml
[11:47:15] <Typhon> "I do think a small- to medium-sized community like OCaml's should work hard not to fragment around dialects" -- соглашусь, пожалуй
[11:50:41] <ʇsʎɯ> а может кто-нибудь мне показать как говно-код на original становится няшкой на revised?
[11:51:25] <ʇsʎɯ> gds: я наконец-то не забыл приволочь LVQ на OCaml
[11:51:31] <ʇsʎɯ> Classifier: http://pastebin.com/C82uby2v
Util: http://pastebin.com/KTG5Kknv
[11:52:13] <Typhon> m, gds ссылки кидал вчера. http://repo.or.cz/w/ocaml-dbf.git/tree/fc2a58bc93d6b73c728e5d03c498bd6529c15abb http://hg.ocamlcore.org/cgi-bin/hgwebdir.cgi/ocaml-cyclist/ocaml-cyclist/file/tip/cyclist.ml
[11:59:09] <ʇsʎɯ> почитал http://pauillac.inria.fr/~ddr/camlp5/doc/htmlc/revsynt.html не понравился он мне
[11:59:38] <ʇsʎɯ> не вижу, чтобы он эдакое решал там, просто кому-то C нравится больше ALGOL
[12:08:27] <gds> f[x]: "then you better discourage using ocaml at all" -- травишь жостко.
[12:15:34] yakov вошёл(а) в комнату
[12:15:47] <yakov> рун
[12:16:09] <gds> m, насчёт revised -- например,
match a with
  0 ->
     match b with
        1 -> ..
        2 -> ..
  10 -> ..
вот тут требуется говноскобки / говнобегиненд, чтобы код работал правильно (как я его выровнял, а не как оно парсится)
с if тоже подобное было, не вспомню сходу.  Да и вообще, закрытые конструкции рулят (в том числе туплы, списки).
Далее -- irrefutable patterns.  Теперь не напишешь
let h::t = somefunc (), будешь вынужден обрабатывать явно пустой список, что увеличивает надёжность-очевидность кода.
В конструкторах лучше прописывается, где конструктор n-местный, а где одноместный, хранящий тупл.
Кстати, http://pauillac.inria.fr/~ddr/camlp5/doc/htmlc/revsynt.html сейчас не очень актуально -- do {} уже нет, \+ тоже, begin-end теперь есть, и может ещё что-то.
[12:17:56] <yakov> скажите а можно godi сказать взять готовый компилер?
[12:18:16] <yakov> а то я просто хочу батарейки. они че-то не собираются под венду, валятся на batConcurrent
[12:18:25] <yakov> хотел из godi их взять.
[12:18:44] <yakov> а godi наровить весь мир сначала собрать..
[12:19:25] <Typhon> one word -- overbld!
[12:20:17] <yakov> :-D
[12:20:42] <yakov> ну, ладно, послали так послали. посморю че там есть.
[12:20:59] <yakov> но скажите мне когда есть годи зачем было еще оверблд делать?!
[12:21:08] <gds> NIH!1111
[12:21:14] <yakov> ДА-А!!!
[12:21:20] <yakov> НИХ рулит!!!!
[12:21:21] <f[x]> о, не в бровь, а в глаз
[12:22:23] <yakov> учитывая какие трудности у коммунити с абсорбцией нового...
[12:22:27] <yakov> ;-)
[12:23:12] <gds> зато у нас есть виндовый инсталлер!
[12:23:31] <yakov> :-D
[12:23:47] <yakov> да,я не спорю, я оверблд явно лучше.
[12:24:02] <ʇsʎɯ> ну что, кто-нибудь прокомментирует мой высер?
[12:28:33] <yakov> ксати, кто в теме в окамл есть DLL-ки? :-)
[12:28:42] <yakov> дебильно задал вопрос, да. :-)
[12:29:42] <gds> способ линковать код (в том числе нативный код в рантайме из .so/.dll) -- есть.
[12:30:22] <gds> m, я не понял сам алгоритм.  Но, учитывая подобную работу с массивами, навряд ли будет умно переписывать её как-то по-другому.
[12:30:36] <gds> ещё есть оптимизации некоторые, если надо, покажу.
[12:31:52] <ʇsʎɯ> ну там суть в том, что без мутабельности будет ооочень медленно
[12:32:05] <ʇsʎɯ> потому что массивы где-то 64000 на 10000, например
[12:32:17] <ʇsʎɯ> матрицы т.е.
[12:33:13] <ʇsʎɯ> что характерно, при обновлении строки матрицы, разницы в скорости между "создать новую, заменить целиком" и "заменять поэлементно мутабельно" нет
[12:34:19] <ʇsʎɯ> ну и там всё заточено на int'ы, потому что для задачи float не нужен, а работает в 3-4 раза быстрее, как оказалось
[12:34:46] <ʇsʎɯ> было бы интересно проверить даст ли на float выигрыш компилер с поддержкой sse2...
[12:35:04] <gds> ну да, мутабельность нужна.  С другой стороны, если задачей было бы параллелить, неизвестно, как бы лучше было реализовать.
[12:35:22] <ʇsʎɯ> про параллелить я придумал вообще просто
[12:35:29] <ʇsʎɯ> каждая строка матрицы - процесс
[12:35:35] <ʇsʎɯ> получает данные, считает, отдаёт
[12:35:57] <ʇsʎɯ> но тут лучше будет erlang, наверное, хотя вряд ли я буду с ним ради этого разбираться
[12:36:40] <ʇsʎɯ> на OCaml OpenMP накрутить не собираются, знает кто?
[12:37:22] <gds> ну про оптимизации,
> Array.fold_left (+) 0 (Util.array_map2 (fun x y -> abs (x -  y)) xs ys)
заменить на for или рекурсивный обход -- не будет создавать матрицу, не будет косвенных вызовов (+), очень вероятно будет быстрее.
[12:38:09] <ʇsʎɯ> там с одной строкой идёт работа
[12:38:12] <ʇsʎɯ> точнее, двумя
[12:38:38] <ʇsʎɯ> на самом деле, скорость оказалась более-менее приличной
[12:39:13] <ʇsʎɯ> где-то 60000 тактов на обработку 64К паттерна
[12:39:33] <ʇsʎɯ> или нет...
[12:39:41] <ʇsʎɯ> щя, погодь, я посчитаю на листике
[12:42:41] <ʇsʎɯ> а, вот
[12:42:52] <ʇsʎɯ> 60К тактов на обработку 3.4К входов для одного выхода
[12:44:51] <ʇsʎɯ> т.е. где-то 3400*5 FPops
[12:45:15] <ʇsʎɯ> 3.5 такта на FPop
[12:45:21] <ʇsʎɯ> очень даже прилично
[12:45:34] <ʇsʎɯ> считая, что на asm было бы 1 t/FPop
[12:46:13] <ʇsʎɯ> на SSE2 можно 0.25 t/FPop
[12:46:29] <ʇsʎɯ> ну и я жду нового лаптопа, чтобы завести эту хрень на CUDA ))
[13:06:08] <Typhon> m, 64к на 10к --- насколько оно разреженное ? к CUDA у камла были вроде биндинги
[13:06:48] <ʇsʎɯ> зто значит разряжённое?
[13:06:52] <ʇsʎɯ> там нет дырок
[13:06:56] <ʇsʎɯ> заполнено всё
[13:15:33] <Typhon> таки "разреженная" :)
[13:16:04] <Typhon> erlang, говорят, в арифметике сосет-с
[13:17:08] <yakov> еще б ему не сосать
[13:17:22] <yakov> но надо смотреть, ведь там жит теперь есть
[13:17:31] <Typhon> btw, может попробуешь, отчитаешся: http://github.com/jacknyfe/ocaml-erlang-port   -- чуваки как раз контролем управляют на ырланке, а считают в окамле
[13:17:49] <Typhon> yakov: JIT? когда появился?
[13:18:12] <yakov> gds: так а слинковать окамл в ДЛЛ-ку которую вызвать из С-ей можно. такое тоже можно? или напр., кусок окамл кода в ДЛЛ-ку и на ходу цеплять к окамловской проге?
[13:18:30] <yakov> Typhon: HiPE всегда был
[13:18:44] <gds> yakov: да, можно оба варианта.
[13:18:55] <yakov> спс
[13:19:44] <Typhon> yakov: а, HiPE -- его ругают, как глючное, особенно на некоторых платформах.
[14:15:43] <gds> давно не брал в руки original syntax, как-то всё коряво получается.  Покритикуйте всё: http://pastebin.com/y7uHwLqx
[14:21:14] <f[x]> в первом match case'у удобно ставить |
[14:21:29] <f[x]> после in отступ не делать
[14:22:10] <f[x]> хотя это как раз недавно в рассылке обсуждали
[14:22:14] <Typhon> tuareg отступ вроде делает :)
[14:23:57] <komar> А не всем ли на это?
[14:24:11] <gds> о да, "|" -- принято.
про in -- у меня там, где оно кагбэ последовательно, отступа нет, а там, где "всё объявил, теперь всё заюзаю" -- отступ есть.  всегда так делал, вроде относительно удобно.
[14:25:30] ʇsʎɯ вышел(а) из комнаты
[14:28:52] <Typhon> во, с последовательно/использование у меня такая же тактика. komar, ну по идее, раз отступает, значит близко к правильному, по идее
[14:29:51] <gds> кстати, тот кусок кода -- начало той самой монадки LogicM ("собирай свои монадки и вон отсюда!11").  Честный (и вроде шустрый, по прикидкам) interleave я сделал, теперь остался честный bind, для чего всё это и задумывалось.
[14:30:19] <Typhon> так и думал, что что-то олеговское там рядом с кодом ходило
[14:31:20] <olegfink> f[x], я тоже думал, что перед первым паттерном удобно ставить "|", пока не провел разок полчаса, разглядывая неработающую грамматику для yacc
[14:36:48] f[x] вышел(а) из комнаты
[14:41:09] ʇsʎɯ вошёл(а) в комнату
[14:43:29] <ʇsʎɯ> gds: я пишу
module Impl : sig
  ...
end = struct
  ...
end
[14:43:32] <ʇsʎɯ> например ))
[14:49:06] <gds> мне горько осознавать, что конец равен структуре :[
[14:53:48] <ʇsʎɯ> ну... у него есть стр-ра )
[15:06:20] ʇsʎɯ вышел(а) из комнаты
[15:34:24] yakov вышел(а) из комнаты
[16:10:24] ʇsʎɯ вошёл(а) в комнату
[16:22:08] Kakadu вышел(а) из комнаты
[16:52:07] serp256 вышел(а) из комнаты
[16:59:32] ʇsʎɯ вышел(а) из комнаты
[17:09:34] <gds> original syntax, я тибя ниновижу.
... in
  ( cont := fun () -> bind_inner ~blist f m;
    stream
  )
--
       Values do not match:
         val bind : ?chunk:int -> ('a -> 'b m) -> 'a Stream.t -> unit
       is not included in
         val bind : ?chunk:int -> ('a -> 'b m) -> 'a m -> 'b m
test case, revised:
# value cont = ref (fun () -> 1);
value cont : ref (unit -> int) = {val=<fun>}
# ( cont.val := fun () -> 2; True );
- : bool = True
original:
# let cont = ref (fun () -> 1);;
val cont : (unit -> int) ref = {contents = <fun>}
# ( cont := fun () -> 2; true );;
Characters 20-21:
  ( cont := fun () -> 2; true );;
                      ^
Warning S: this expression should have type unit.
Characters 23-27:
  ( cont := fun () -> 2; true );;
                         ^^^^
Error: This expression has type bool but an expression was expected of type
         int
[17:12:42] iNode вышел(а) из комнаты
[17:12:47] iNode вошёл(а) в комнату
[17:13:52] <komar> Скобочки не пробовал?
[17:19:08] <gds> так не нравится, когда любое ";" открывает последовательность действий.
[17:30:20] gds вышел(а) из комнаты
[17:37:52] iNode вышел(а) из комнаты
[18:08:30] serp256 вошёл(а) в комнату
[18:19:33] gds вошёл(а) в комнату
[18:53:46] Typhon вышел(а) из комнаты
[19:19:09] Kakadu вошёл(а) в комнату
[20:07:49] Kakadu вышел(а) из комнаты
[20:19:32] serp256 вышел(а) из комнаты
[20:25:12] ermine опять блуждает меж трех сосен типизации
[21:03:54] Kakadu вошёл(а) в комнату
[21:51:47] Kakadu вышел(а) из комнаты
[22:42:04] ermine спилила одну сосну и сделала из нее костыль
[22:43:20] <gds> ermine: хвастайся.
[22:46:34] <ermine> gds: там есть такая фишка:
let primary_db = create_int ()
let db = create_string ()
теперь цепляем db к primary_db в качестве вторичного ключа, оригинальная функция выглядела как
val associate 'a t -> 'b t -> (функция генерации вторичного ключа) -> unit
далее мы ищем по базе с помощью вторичного ключа
val pget : 'a t -> key -> primary_key * data
[22:46:55] <ermine> встал вопрос - какого типа в последней функции primary_key
[22:47:40] <ermine> поэтому фунация associate стала возвращать не unit, а рекорд из двух полей - примари и секондари базы и ее указываем в качестве аргумента в pget
[22:48:19] <ermine> так появилась типизация как на стороне камля, так и на стороне цэ - я туда сую в качестве дополнительного агрумента хэндл примари базы
[22:48:31] <ermine> сосновая костыль :)
[22:51:30] <ermine> ващ сишний код усложняется и потихоньку превращается в бардак для основных функций
[22:53:07] <ermine> но зато работать с этим кодом все веселей и веселей
[22:53:31] <ermine> gds: ты чонить понял??
[22:53:33] serp256 вошёл(а) в комнату
[22:58:00] <gds> что-то -- да, но не всё.  Получилось так, что запись параметризована типами обоих баз, откуда и берёшь тип результата pget?
[22:59:45] <ermine> val pget : 'a t -> 'a -> 'b * string
[23:00:42] <ermine> тут 'b неоткуда вычислить, на стороне цэ может и можно дикими поисками в непубличных местах bdb
[23:01:08] <ermine> pget - это поиск по вторичному ключу, результат - первичный ключ и данные
[23:01:30] <ermine> а ключ всегда типа 'a в 'a t
[23:02:14] <ermine> пришлось подумать как решить сначала типизацию на стороне камля
[23:05:29] <ermine> в результате появилось type ('a, 'b) secondary = { primary: 'b t; db : 'a t} и так pget типизируется как val pget : ('a, 'b) secondary -> 'a -> 'b * string
[23:20:04] <gds> вот теперь чотко понял.  Приличное решение.
Кстати, если вдруг не нужны реально записи с типом secondary (а нужны просто их типы), можно оформить это фантомными типами.
[23:59:12] ygrek вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!