Home
Objective Caml
ocaml@conference.jabber.ru
Вторник, 2 марта 2010< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap | voice по запросу | ocaml мёртв, move on
Конфигурация комнаты
Участники комнаты

GMT+3
[00:07:39] gds вышел(а) из комнаты: Replaced by new connection
[00:07:41] gds вошёл(а) в комнату
[00:13:34] <ermine> gds: под рукой они есть?
[00:14:00] <ermine> gds: чтобы попробовать воспроизвести одну багу
[00:19:25] gds вышел(а) из комнаты
[00:19:38] gds вошёл(а) в комнату
[00:50:18] ermine вышел(а) из комнаты
[01:05:14] digital_curse вышел(а) из комнаты
[01:51:41] <Typhon> в качестве майндфака:
compute => - : 'a * float -> float * 'a -> 'a * float = <fun>
let f lst = fst << List.fold_left compute ("", 0.0) << List.combine lst;;
val f : float list -> string list -> string = <fun>
можно ли в f (и как?) избавиться от аргумента, в пойнтфри записать, типа.
[01:52:16] gds вышел(а) из комнаты
[01:53:29] <Typhon> (<<) => - : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>, если что
[02:39:33] gds вошёл(а) в комнату
[02:58:33] gds вышел(а) из комнаты: Replaced by new connection
[02:58:37] gds вошёл(а) в комнату
[03:20:35] gds вышел(а) из комнаты: Replaced by new connection
[03:20:37] gds вошёл(а) в комнату
[03:31:16] Typhon вышел(а) из комнаты
[03:50:38] gds вышел(а) из комнаты
[03:57:13] gds вошёл(а) в комнату
[04:09:45] gds вышел(а) из комнаты: Replaced by new connection
[04:09:47] gds вошёл(а) в комнату
[04:16:40] gds вышел(а) из комнаты: Replaced by new connection
[04:16:41] gds вошёл(а) в комнату
[04:47:47] gds вышел(а) из комнаты: Replaced by new connection
[04:47:49] gds вошёл(а) в комнату
[05:31:43] gds вышел(а) из комнаты: Replaced by new connection
[05:31:45] gds вошёл(а) в комнату
[06:46:52] gds вышел(а) из комнаты
[07:34:02] daapp вошёл(а) в комнату
[08:17:15] iNode вошёл(а) в комнату
[08:23:23] ygrek вошёл(а) в комнату
[08:58:43] gds вошёл(а) в комнату
[09:03:22] <gds> ermine: не, сейчас под рукой нет сэмплов lablgtk2.  брал какие-то общедоступные, из интернетов.
[09:07:09] sceptic вышел(а) из комнаты
[09:19:35] <gds> Typhon: проблема в том, что выражение "List.combine .." в пойнтфри должно кушать два аргумента, тогда как с помощью "<<", уже применённого к двум аргументам, оно сможет скушать только один аргумент.
Сначала я сделал левую функцию:
# let (( <<< ) : ('c -> 'd) -> ('a -> 'b -> 'c) -> 'a -> 'b -> 'd) = fun _ _ -> raise Exit;;
и удостоверился, что
# let f = fst << List.fold_left compute ("", 0.0) <<< List.combine;;
типизируется нормально, а потом набросал реализацию:
# let ( <<< ) cd abc = fun a b -> cd (abc a b);;
val ( <<< ) : ('a -> 'b) -> ('c -> 'd -> 'a) -> 'c -> 'd -> 'b = <fun>
судя по тому, что по типам сходится, работать должно.  Плюс-минус всякие мономорфизации, как и обычно в подобных случаях.
Кроме того, для подобных извратов в общем виде могут пригодиться функции
curry2 : ('a -> 'b -> 'c) -> ('a * 'b) -> 'c
uncurry2 : (('a * 'b) -> 'c) -> 'a -> 'b -> 'c
(может что-то путаю с терминологией curry vs uncurry)
[09:55:59] Typhon вошёл(а) в комнату
[09:59:07] <Typhon> gds: я тут начитался ПФП№4, там последняя статья как раз про пойнтфри, с помощью всяких извратов с сиськой ( . ) ситуация с двумя аргументами решается. за реализацию спасибо, буду крутить :)
[10:34:54] gds вышел(а) из комнаты
[10:35:10] gds вошёл(а) в комнату
[10:46:20] Sergey Plaksin вошёл(а) в комнату
[10:50:35] f[x] вошёл(а) в комнату
[11:24:02] sceptic вошёл(а) в комнату
[11:39:13] ermine вошёл(а) в комнату
[11:48:14] ygrek вышел(а) из комнаты
[12:25:44] <f[x]> http://downforeveryoneorjustme.com/http://gdsfh.dyndns.org
[12:46:23] <gds> f[x]: ага.  утром думал, что отвалился только вайфай, и не стал диагностировать дальше, а потом, как попинговал с работы, понял, что отвалился адсл.  явных причин не видел.  приду домой и буду разбираться, ясное дело.
вот поэтому-то и нужно, чтобы в нормальном надёжном месте оно стояло.  я пробую обеспечить работу, но вылезают такие косяки.
[12:48:05] <f[x]> gds: np, просто информирую.
[12:48:51] <f[x]> для fun'а лучше организовать распределённую систему ненадёжных мест :)
[12:49:04] <gds> понял.  Но, всё равно, буду поддерживать вику.
[12:49:11] <gds> а да, систему -- это ок :)
[12:50:45] <f[x]> как ограничит в топлевеле длину печатаемой строки?
[12:50:57] <f[x]> #print_length #print_depth не подходят
[12:51:09] <f[x]> хотел заменить принтер строки - но не могу найти его имени
[12:57:28] <f[x]> ответ: достаточно просто #install_printer сделать - он перекрывает встроенный принтер
[13:02:05] <f[x]> # let pp_string f s = Format.fprintf f "%S" (if String.length s > 100 then (String.slice ~last:100 s) ^ "..." else s);;
# #install_printer pp_string;;
[13:21:29] <ermine> f[x]: ты в lablgtk не пользовал custom_tree_model?
[13:28:53] <f[x]> нет
[13:29:04] <ermine> жаль
[13:29:09] <f[x]> ermine: ты запасти код куда-нибудь, а коллективный разум подумает
[13:30:50] <ermine> f[x]: у тебя lablgtk2 под рукой?
[13:32:07] <ermine> f[x]: скачай http://yo.jabber.ru/~ermine/clist.ml и запусти lablgtk2 clist.ml
[13:32:25] <ermine> если утопить клавишу Down, оно сглючит
[13:32:31] <ermine> а почему - не могу понять
[13:49:58] ygrek вошёл(а) в комнату
[13:57:46] <f[x]> у меня оно вообще крэшится если окно подвигать
[14:01:32] <f[x]> наверное надо камло обновить, но я не хочу потому-что тогда не смогу собранные бинарники rsync'ать на сервер (разные версии glibc)
[14:01:37] <ermine> да вообще оно глючит
[14:02:02] <ermine> осталось понять пчу и чем этот пример отличается от examples/custom_tree.ml
[14:02:35] <ermine> код там и там очень простой
[14:17:03] <ermine> имхо глючит model#get
[14:20:34] daapp вышел(а) из комнаты
[14:22:07] gds вышел(а) из комнаты
[14:22:42] gds вошёл(а) в комнату
[14:30:00] <Typhon> еще немножко типа майндфака :) http://paste.in.ua/394/ -- есть два варианта двух функций. какой порядок аргументов для каждой из них лучше, по вашему мнению, и как бы назвали, если бы писали их/пользовались :)
[14:33:29] <olegfink> а можно ли pervasives вкомпилировать в ocaml статически?
[14:33:43] <olegfink> а то сейчас ocaml (который топлевел) хочет pervasives.cmi
[14:36:07] <gds> Typhon: а пофиг, попробуй наугад.  Так как варианта 4, я могу дважды кинуть монетку и сообщить результаты, если хочешь.
[14:36:12] <gds> olegfink: стандартных способов нет.  А может подсунуть ему pervasives.cmi?
[14:37:02] <olegfink> не хочу, я для try ocaml in your browser хочу как можно более компактное что-нибудь
[14:37:43] <Typhon> gds: ясно :) думал может что-то похожее кто имеет или название какое "общепринятое"
[14:37:47] <gds> Typhon: почему -- потому что всё равно "пайплайн" не сделать, штатный s-комбинатор применять нафиг надо, с каррингом -- судя по задаче видно должно быть.
[14:40:13] <gds> если чо, S x y z = x z (y z), судя по http://en.wikipedia.org/wiki/SKI_combinator_calculus
[14:42:09] <Typhon> во, помню, что где-то видел подобное, спасибо
[14:42:28] <ermine> gds: правильный комбинатор, только связи с примером не вижу
[14:42:39] <olegfink> даже с -linkall -custom оно все равно зачем-то хочет pervasives.cmi
[14:42:45] <olegfink> чего ему надо-то?
[14:44:32] <gds> # let s x y z = x z (y z);;
val s : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
судя по типу, он прямо равен выписанному комбинатору f1.
[14:47:26] <ermine> gds: просто переменные неинтересно, вот интересно, если там следующие комбинаторы, например классический комбинатор SKK
[14:48:08] <ermine> тут yz выпадут нафиг
[14:53:40] shoroh-net вошёл(а) в комнату
[15:01:56] <gds> ermine:
$ ocaml -rectypes
# let k x _ = x;;
val k : 'a -> 'b -> 'a = <fun>
# let s x y z = x z (y z);;
val s : ('a -> 'b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun>
# s k k;;
- : '_a -> '_a = <fun>
# s k s k;;
- : '_a -> '_b -> '_a = <fun>
# s (k (s i i)) (s (s (k s) k) (k (s i i)));;
- : ('_a -> '_a) -> '_a = <fun>
# s s k (s (k (s s (s (s s k)))) k);;
- : ('_a -> '_a) -> '_a = <fun>
а что должно выпасть?
[15:05:49] <ermine> s k k x y z должен вернуть x
[15:06:19] <ermine> если память об комбинаторах не изменяет :)
[15:07:18] <f[x]> olegfink: -nopervasives видел?
[15:07:35] <f[x]> кастомный топлевел делаешь?
[15:08:09] <gds> точнее, (s k k) x должно быть равно x.  Это мы видим по типам:
# s k k;;
- : '_a -> '_a = <fun>
ну и по значениям:
# (s k k) "qwe";;
- : string = "qwe"
[15:09:01] <ermine> gds: пчу скобки?
[15:09:15] <olegfink> f[x], о!
[15:09:21] <ermine> вот скобки не рулят :)
[15:09:28] <gds> можно и без них.
[15:10:09] <ermine> а, я немного протупила
[15:10:10] <olegfink> только вот теперь горе с депендами
[15:10:20] <olegfink> $ OCAMLLIB=`pwd`/stdlib byterun/ocamlrun ./ocamlc -nopervasives -custom stdlib/pervasives.cmo stdlib/pervasives.cmo toplevel/toplevellib.cma toplevel/topstart.cmo -o myocaml
[15:10:22] <olegfink> File "_none_", line 1, characters 0-1:
[15:10:24] <olegfink> Error: Error while linking toplevel/toplevellib.cma(Misc):
[15:10:26] <olegfink> Reference to undefined global `String'
[15:10:34] <olegfink> ой
[15:12:14] <f[x]> ну не знаю, я бы вообще обычный ocaml в qemu запихнул :)
[15:13:28] <f[x]> да, и как разумно спрашивают в irc - пуркуа бы не па? скомпиль свой pervasives.cmi за вычетом "опасных" функций и положи куда надо
[15:14:51] <olegfink> ну, qemu не выход
[15:15:00] <olegfink> я хочу по одному toplevel на каждого клиента
[15:15:18] <olegfink> а для этого весьма-таки хочется, чтобы оно было статически слинковано
[15:15:26] <ermine> а мою зогадку тут похоже не решат
[15:15:27] <ermine> ы
[15:15:36] <olegfink> да и из эстетических соображений тоже так краше
[15:16:26] <olegfink> f[x], ты ж не будешь заводить по qemu на каждого посетителя? :-)
[15:17:40] <f[x]> почему нет? ;)
[15:17:56] <olegfink> потому что стартап тайм большой
[15:18:25] <olegfink> хотя конечно можно под энто дело откопать мой ocaml-uboot
[15:18:45] <olegfink> заодно никаких опасных функций не будет :-)
[15:18:48] <f[x]> не факт. тогда можно всех клиентов держать в одном qemu
[15:18:52] <olegfink> по причине их нереализованности
[15:22:39] <f[x]> http://caml.inria.fr/pub/ml-archives/caml-list/2005/04/2119b7490aa70835c7fc92bec6673085.en.html
[15:26:50] <f[x]> http://alan.petitepomme.net/cwn/2004.02.24.html#3
[15:30:49] <olegfink> хм
[15:31:41] <olegfink> f[x], ну если qemu само умеет всякие ulimitы, то может его и надо брать
[15:31:59] <olegfink> только зачем-то будет два интерпретатора подряд
[15:32:11] <f[x]> olegfink: не сдавайся! :)
[15:32:50] <gds> гамак и противогаз выдадим, если чо.
[15:33:09] <f[x]> :)
[15:33:18] <olegfink> ну а что мне делать, если я хоть убей (после всех объяснений в #ocaml) не понимаю, нафига при .cmi, если я руками линкую .cmi
[15:33:22] <olegfink> cmo то есть
[15:34:02] <olegfink> http://dpaste.com/166852/
[15:34:13] <olegfink> вот честно руками выписанные депенды
[15:34:32] shoroh-net вышел(а) из комнаты
[15:35:18] <f[x]> olegfink: ну компилер смотрит в cmi всегда видимо
[15:35:53] <f[x]> ой
[15:41:06] <olegfink> осталось найти, какое место toplevel это делает?
[15:41:32] <f[x]> driver/compile.ml
[15:42:06] <f[x]> попробуй в линковку добавить cmo с кодом типа Clflags.nopervasives := true ?
[15:48:18] <olegfink> йо!
[15:48:42] <olegfink> ой, а (+) тоже в pervasives :-)
[15:49:25] <f[x]> там много чего в pervasives :)
[15:49:31] <f[x]> так что - получилось?
[15:49:41] <olegfink> хм
[15:50:17] <olegfink> получилось, но теперь мне не заставить его заюзать -custom pervasives.cmo
[15:51:23] <f[x]> почему это?
[15:51:49] <olegfink> http://dpaste.com/166862/ -- вот дифф на всякий случай
[15:52:03] <f[x]> и кстати почему бы не собирать топлевел ocamlmktop'ом?
[15:52:29] <olegfink> ну, потому что ocamlmktop вызывает ocamlc
[15:52:39] <olegfink> с неправильным путем от дефолтного ./configure
[15:52:47] <f[x]> а, логично
[15:53:00] <olegfink> exec /usr/local/bin/ocamlc -linkall toplevellib.cma "$@" topstart.cmo
[15:53:04] <olegfink> вот весь ocamlmktop
[15:54:39] <olegfink> http://dpaste.com/166865/ -- что с этим дальше делать, не знаю
[15:57:41] <f[x]> ну а pervasives.cmi топлевел найти может?
[15:57:57] <olegfink> а
[15:57:59] <f[x]> или не надо
[15:58:05] <olegfink> не может, конечно
[15:58:09] <olegfink> видимо, надо
[15:58:17] <olegfink> хотя странно
[15:58:44] <olegfink> я ж не обязан в -custom обычно для нормальной либы давать .cmi?
[15:59:56] <f[x]> не уверен
[16:00:23] <olegfink> # external (+) : int -> int -> int = "%addint" ;;
[16:00:25] <olegfink> external ( + ) : int -> int -> int = "%addint"
[16:00:27] <olegfink> # 2+2 ;;
[16:00:29] <olegfink> - : int = 4
[16:00:31] <olegfink> ну вот руками все работает
[16:00:49] <ermine> f[x]: я вот нашла, что если в examples/custom_tree.ml закомментировать вторую колонку с его рендерером, то оно падает еще веселей
[16:00:55] <ermine> какая-то шняга с рендерером
[16:03:02] <olegfink> о!
[16:03:27] <olegfink> скопировал pervasives.ml в pervs.ml, скомпилил свой рантайм -> готово
[16:03:40] <olegfink> осталось понять, как сделать "open Pervs"
[16:04:54] <f[x]> olegfink: cmi нужен для топлевела использующего обычную либу скомпиленную с -custom
[16:05:26] <olegfink> а, гтово -- это была иллюзия
[16:05:33] <olegfink> он взял pervs.cmi из $PWD
[16:06:17] <olegfink> значит, все плохо все-таки
[16:07:18] <f[x]> $ cat q.ml
let test () = print_endline "test"
$ ocamlc q.ml
$ ocamlc -custom -a -o qlib.cma q.cmo
$ ocamlmktop qlib.cma -o qtop
$ ./qtop
        Objective Caml version 3.11.1
# open Q;;
#
$ rm q.cmi
$ ./qtop
        Objective Caml version 3.11.1
# open Q;;
Error: Unbound module Q
#
[16:08:18] <f[x]> ermine: может там зависимость от версии gtk какая-нибудь?
[16:08:27] <f[x]> дома поиграюсь, интересно
[16:12:45] <ermine> f[x]: примеры из lablgtk работают правильно
[16:12:57] <ermine> свой пример при этом не работает
[16:13:22] <ermine> f[x]: запусти examples/custom_tree.ml
[16:16:12] <ermine> какая-то алхимическая мистика
[16:23:02] olegfink вышел(а) из комнаты
[16:24:00] olegfink вошёл(а) в комнату
[16:56:07] Typhon вышел(а) из комнаты
[16:56:19] Typhon вошёл(а) в комнату
[17:14:51] Kakadu вошёл(а) в комнату
[17:30:58] gds вышел(а) из комнаты
[17:54:55] iNode вышел(а) из комнаты
[18:04:23] gds вошёл(а) в комнату
[18:37:59] gds вышел(а) из комнаты: Replaced by new connection
[18:38:01] gds вошёл(а) в комнату
[18:53:58] gds вышел(а) из комнаты: Replaced by new connection
[18:53:59] gds вошёл(а) в комнату
[18:57:39] sceptic вышел(а) из комнаты
[19:15:56] Typhon вышел(а) из комнаты
[19:54:02] Sergey Plaksin вышел(а) из комнаты
[19:57:25] f[x] вышел(а) из комнаты
[20:00:09] DangerMan вошёл(а) в комнату
[20:30:52] Typhon вошёл(а) в комнату
[20:35:58] Kakadu вышел(а) из комнаты
[21:05:11] gds вышел(а) из комнаты: Replaced by new connection
[21:05:13] gds вошёл(а) в комнату
[21:25:43] ermine похоже нашла как пабедить lablgtk с custom_tree_model и думает - теперь ржать или рыдать
[21:29:46] <ermine> gc - штука страненькая, и с ней надо бороться странными методами
[21:35:22] <ermine> gds: там в вики за последний месяц не появилось новых заметок?
[21:35:42] <ermine> может пора открывать тему lablgtk и записывать туда находки
[21:50:52] <Typhon> ermine, я думаю, если есть что писать -- стоит писать :)
[21:51:38] <Typhon> ermine, кстати, ты кажется в сульци активно используешь динамическую загрузку плагинов всяких (если я не ошибаюсь) -- по этому поводу сможешь написать тонкости какие-нибудь, с чем сталкивалась
[21:52:15] <ermine> не использую, но реализовала
[21:52:32] <Typhon> а почему не используешь?
[21:52:58] <ermine> ну как-то не приходилось
[21:53:07] <ermine> предпочитаю статически слинковать
[21:53:49] <ermine> а тонкостей никаких нет - в Dynlink модуле в апи фактически только две функции полезны из пяти
[21:54:32] <ermine> ну можно и по поводу динлинка заметку в вики накатать
[21:54:42] <ermine> для тех, кому лень читать доку
[22:01:08] gds вышел(а) из комнаты: Replaced by new connection
[22:01:09] gds вошёл(а) в комнату
[22:02:40] DangerMan вышел(а) из комнаты
[22:31:21] <ygrek> ermine: а ты не отключала compaction в gc для lablgtk что-ли?
[22:31:36] <ygrek> т.е. проблема решилась?
[22:41:49] <ermine> ygrek: нет
[22:42:35] <ermine> ygrek: там лействительно шняга в рендерере, там зверски работал gc - уничтожал за первый проход половину данных табличек, за второй - все остальное
[22:42:52] <ermine> это если загружать в топлевел lablgtk2
[22:43:07] <ermine> в нативном коде оно чаще всего сразу умирало
[22:44:34] <ermine> ygrek: лечится просто - надо в одном из любых методов renderer как-нить (любым способом) использовать методы кастомерного класса модели, а не модели, которую тебе дают в калбэке, это удерживало gc от шалостей
[22:45:35] <ermine> ygrek: если ты в мой код впишешь после let data = model#get ... следующую строчку let _path = cmodel#custom_get_path row in, то оно перестанет падать
[22:47:07] ermine дико щастлива находкой - теперь можно делать более быстрый и гибкий ростер в горгоне
[23:20:39] <ygrek> ermine: ну умирать то от этого не должно было
[23:23:03] <ermine> ygrek: умирает наследственный класс
[23:23:37] <ermine> может бага, хз
[23:24:01] <ermine> а может так ооп в камле работает :)
[23:24:06] sceptic вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!