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

GMT+4
[00:00:02] <604> ну, раз пошла такая пьянка... как компилировать-то? :)
[00:00:51] <gds> что именно?
[00:03:08] <604> свои творения
[00:03:42] <gds> del творение.exe ; ocamlbuild творение.byte && ren творение.byte творение.exe
[00:04:35] <gds> прямо в батник можно забить.
если работает.
[00:04:36] <604> хм... если не ошибаюсь, это в байткод компилирует?
[00:04:42] <gds> s/byte/native/
[00:06:47] <604> как мило. bash требует :)
[00:09:15] <604> документация всё же советует использовать ocamlopt
[00:11:25] <604> а оно в свою очередь падает от Assembler error
[00:14:33] <gds> а насчёт той идеи с кросскомпиляцией. Коллективный разум, взываю ктибе.
предположим, есть исполняемые msvc-gcc, msvc-as, msvc-ld, которые принимают гнутую ком.строку, но вызывают утилиты из msvc.
этим я обеспечу рабочие связи:
c -> obj, asm -> obj, obj -> lib, obj+lib -> exe
поэтому всё, что генерится из c+asm, у меня будет генериться с gcc-подобным интерфейсом.
дальше -- окамл. связь cm{o,x,a,xa} -> obj осуществляется через ocaml{c,opt} -> asm -> obj. из-за первого преобразования (через асм) окамл должен знать, что он под msvc работает.
то есть, имея окамл, вызывающий напрямую cl, ml, link, мы имеем связи: ml[i] -> cm*, cm*+obj+lib -> asm -> o+lib -> exe, причём сишный компилятор (msvc-gcc) и подобные утилиты имеют гнутый интерфейс, и доступны все радости mingw+msys.
но тут надо указать, что внешние c/asm-файлы должны собираться msvc-{gcc,as}, а сгенерированные компилятором должны собираться {cl,ml}. Вот тут -- гемор.
Далее берём софтину, умеющую собираться под mingw, и подсовываем ей подобную гибридную среду.
где поимеем фейл? Насчёт гемора -- как быть? Влом делать gnu -> intel asm преобразовалку.
[00:14:57] <ygrek> 604: vsvars32 настрой
[00:16:54] ygrek столько букв завтра попробует осилить
[00:21:13] <ygrek> о, камло трепыхается - cwn новый выпуск
[00:21:43] <gds> надеюсь, с некрологом?
[00:22:29] <604> ygrek: должна появится переменная %VS80COMNTOOLS% ?
[00:22:30] <gds> кстати, урл подкинь, на ночь глядя почитать.
[00:22:51] <ygrek> gds: зачем тебе, ты ж рассылку читаешь
[00:23:21] <ygrek> 604: да, это один из признаков. важны же PATH INCLUDE и LIB
[00:23:36] <gds> мог что-то недостаточно рассмотреть. хотя вроде смотрел в оба.
[00:23:45] <gds> так что не суть важно.
[00:23:59] <ygrek> http://alan.petitepomme.net/cwn/2009.08.25.html
[00:24:26] <gds> "Here is the latest Caml Weekly News, for the week of July 14 to August 25, 2009"
круто!
[00:25:08] <ygrek> время замедлилось, и мир вывернулся наизнанку
[00:27:19] <ygrek> в #ocaml можно обсуждать какую-то макаку - ocaml dsl для sql
[00:27:57] <ygrek> * модно
[00:28:06] <gds> о да, пропустил minimal sorting networks по одной из ссылок.
[00:28:17] 604 вышел(а) из комнаты
[00:28:30] <gds> #ocaml -- irc?
[00:28:55] <gds> ну нехай балуются, ведь это модно.
[00:28:56] <ygrek> yup
[00:34:08] 604 вошёл(а) в комнату
[00:35:26] ygrek установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | Иногда лучше кодировать, чем разговаривать
[00:36:13] <gds> серьёзная предъява.
[00:36:25] gds ушёл кодировать диван
[00:37:26] <604> офигенный паззл
[00:42:12] ygrek вышел(а) из комнаты
[01:28:18] 604 вышел(а) из комнаты
[01:45:27] Michael Holub вышел(а) из комнаты
[01:47:32] Michael Holub вошёл(а) в комнату
[01:50:45] Michael Holub вышел(а) из комнаты
[01:53:27] Michael Holub вошёл(а) в комнату
[01:59:32] <Michael Holub> а в ocaml есть стандартная функция, которая свопает аргументы местами? типа let swap f x y = f y x?
[02:40:47] Michael Holub вышел(а) из комнаты
[02:42:04] Michael Holub вошёл(а) в комнату
[04:08:02] Michael Holub вышел(а) из комнаты
[04:10:49] Michael Holub вошёл(а) в комнату
[04:32:30] Michael Holub вышел(а) из комнаты
[05:03:12] Michael Holub вошёл(а) в комнату
[05:11:10] Michael Holub вышел(а) из комнаты
[05:12:04] Michael Holub вошёл(а) в комнату
[06:09:08] john вышел(а) из комнаты
[06:39:19] john вошёл(а) в комнату
[08:33:58] <gds> стандартной swap нет, но легко пишется.
однако необходимо тщательно подумать, а нужна ли вообще подобная функция.
[08:34:00] gds вышел(а) из комнаты
[08:59:09] gds вошёл(а) в комнату
[09:44:05] Michael Holub вышел(а) из комнаты
[09:45:35] Michael Holub вошёл(а) в комнату
[09:49:10] Mon вышел(а) из комнаты
[09:50:06] <Michael Holub> ну это у меня хаскельный point-free style в привычку вошел, а там это бывает нужно, вон в окамле нету sections типа (3/) или (/3)
[09:52:42] <gds> вот я как раз про point-free и говорю -- стоит тщательно подумать, нужно ли оно.
[09:52:57] <gds> fun x -> 3 / x == ( / ) 3
[09:54:22] <gds> соответственно, (swap ( / )) 3 == fun x -> x / 3
[09:54:45] <Michael Holub> ну никто и не спорит, что обойтись без него нельзя, но с ним удобнее :)
[09:55:20] <gds> опять же вопрос в удобстве -- удобнее писать или читать?
[09:56:29] <Michael Holub> ну мне вполне удобно читать, а как другим я пока не знаю, просто нет других, кто бы читал мои сорцы
[09:57:03] <gds> кстати, если нужно, есть аналог хаскелевого x `f` y:
let ( /* ) x y = y x
let ( */ ) x y = x y
x /* f */ y
[09:58:01] <Michael Holub> интересный трюк :)
[09:58:41] <Michael Holub> а с либами в окамле же все получше, да?
[09:58:48] <gds> советую решить на окамле практически-полезную задачку, но такую, чтобы потом (через полгодика например) была немалая вероятность дальнейших ковыряний с ней. А через некоторое время, при необходимости прочитать или исправить код, сразу станет понятно, какие конструкции насколько хороши. Действительно индивидуально.
[09:59:05] 604 вошёл(а) в комнату
[10:00:08] <gds> с либами в хаскеле лучше, говорят. Однако на практике -- даже не знаю: решили с одним знакомым кое-что совместное оформить (хаскель и окамл, похожий апи), так оказалось, что fastcgi/scgi и базы данных у меня уже доступны, а ему надо будет долбаться.
[10:00:10] <Michael Holub> ну тут я не спорю :) некоторые образцы кода на хаскелле выглядят ужаснее любой перлянки :)
[10:01:52] <Michael Holub> ну в хаскелле много либ, но их качество страдает, так что в реальности их не так уж и много - особенно все грустно с документацией, часто единственное, что есть это список функций с типами, чуть лучше случай это ссылка на какую-нибудь научную работу, по которой писалась либа
[10:03:38] <gds> насчёт документации -- дада, видел :)
да и в случае fastcgi -- либа есть, но при использовании её в деле поимеем ленивые строки, которые и память жрут, и вообще требуют слишком аккуратной работы с ними, чтобы можно было через них пропускать большие объёмы данных.
[10:05:23] <Michael Holub> ну есть и неленивые в принципе и даже очень быстрые или там никак другую реализацию не подставить?
[10:07:28] <Michael Holub> причем ленивые на строгие меняются одной строчкой, наверное, там где-то в другом месте ленивость помешала
[10:08:21] <Michael Holub> а стандартная библиотека в окамле такая и есть бедная? я там слышал о каких-то batteries или это не совсем то?
[10:08:23] <gds> я не настоящий сварщик, не знаю. Чел говорит, что нужно переписывать, и хочет брать потоки: http://www.haskell.org/haskellwiki/Library/Streams . Впрочем, опять же, лениво вникать в это дело.
[10:08:47] <gds> batteries -- это то.
ещё extlib хороша.
[10:34:47] ygrek вошёл(а) в комнату
[10:48:18] f[x] вошёл(а) в комнату
[10:52:52] Mon вошёл(а) в комнату
[11:02:07] Michael Holub вышел(а) из комнаты
[11:02:07] Michael Holub вошёл(а) в комнату
[11:08:35] Typhon вошёл(а) в комнату
[12:04:52] ygrek вышел(а) из комнаты
[12:15:42] ygrek вошёл(а) в комнату
[12:43:18] ygrek вышел(а) из комнаты
[12:43:33] ygrek вошёл(а) в комнату
[12:44:44] 604 вышел(а) из комнаты
[12:53:48] ygrek вышел(а) из комнаты
[13:00:51] gds вышел(а) из комнаты
[13:01:16] gds вошёл(а) в комнату
[13:09:34] 604 вошёл(а) в комнату
[13:10:30] <604> собрал наконец, Жалко, что разработчики в ридми не потрудились упомянуть, что нужно еще качать Windows SDK на 400 Мб
[13:10:55] <gds> вроде чото упоминали подобное.
[13:11:13] <gds> а в остальном собирается нормально?
[13:14:14] <604> ну да, запускал, работает как положено. Удивил, правда, размер exe - 120Kb
[13:35:32] john вышел(а) из комнаты
[16:05:04] <gds> доломал oci8ml, чтобы оно с нуллами работало по-человечески, дописал кривущий dbd-"драйвер" (частично совместимый с ocamldbi). но что раньше это было гэ, что сейчас, но сейчас оно чуть лучше. Да и нормальные люди (которые не под mingw/cygwin) вполне могут юзать новые нормальные биндинги, сделанные через плюсовую библиотеку для оракла.
Вот в подобных случаях и не ясно, релизить ли.
[16:11:30] <f[x]> хотя бы "пререлизить"
[16:12:00] f[x] установил(а) тему: Камль -- http://caml.inria.fr | Логи -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ | Верблюды грязи не боятся! | release crap
[16:12:23] <gds> гы
[16:22:56] <f[x]> Хм, в netcgi2_fcgi текут дескрипторы. В handle_connection если shutdown кидает исключение, то close не вызывется. А он бывает кидает ENOTCONN после SIGPIPE..
[16:23:33] <f[x]> [pid 13392] write(43, "\1\7\0\1\0\0\0\0\1\6\0\1\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\0\0\0\1"..., 1400) = -1 EPIPE (Broken pipe)
[pid 13392] --- SIGPIPE (Broken pipe) @ 0 (0) ---
[pid 13392] shutdown(43, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected)
[16:27:03] <gds> мне помогло (в другом случае) игнорировать sigpipe. спробуй, а вдруг.
[16:32:24] <f[x]> да я уже ocamlnet пересобрал
[16:32:54] <f[x]> а можно с коммандлайна как-то посмотреть настройки сигналов для процесса?
[16:33:59] <gds> пересборка ocamlnet ортогональна к игнорированию sigpipe.
про сигналы -- хрен знает.
[16:35:44] <f[x]> согласен
[16:41:23] john вошёл(а) в комнату
[17:37:43] Mon вышел(а) из комнаты
[17:38:47] Mon вошёл(а) в комнату
[17:51:16] gds вышел(а) из комнаты
[18:26:24] gds вошёл(а) в комнату
[18:36:49] <ermine> как же утомила засада с рекурсивной юзанием функций из двух модулей
[18:37:16] <ermine> выносить чоль в третий модуль всего одну строчку, чтобы разрубить рекурсию
[18:37:55] ermine плаксиво смотрит на gds в ожидании гениальных идей
[18:42:04] <f[x]> передавать функцию как параметр?
[18:44:03] <ermine> гиморно получится, я пока ее вызов закомментарила в ожидании более светлых идей
[18:44:47] <gds> да лажа там с этим делом. есть идея, но никак не гениальная. если получится -- отпишу.
[18:46:16] <ermine> всего три способа - вынести в отдельный модуль, передавать как параметр и закомментарить
[18:48:50] <f[x]> скопипастить. рекурсивно.
[18:49:32] <ermine> не получится скопипастить
[18:49:41] <ermine> это объект логгера
[18:49:48] <ermine> классовый объект
[18:55:46] <gds> но есть идея именно для функций. если методы обернуть в fun x -> y, то может и получится. устраивает ограничение?
("может" == именно что без гарантий)
[19:00:08] <ermine> функция, которая трогает логгер, сама вызывается в куче модулей, и надо типа седом дописать еще один аргумент, ужос
[19:01:56] <gds> так подожди, сводится ли всё к коду вида
let rec fun1 .. = ... fun2 ..
and fun2 .. = .. fun1 ..
?
[19:03:50] <ermine> module1
open Module2
let logger = ...
module2
let f x = logger#print ..
[19:04:44] <gds> что из Module2 используешь в Module1?
[19:05:17] <ermine> одна функция, кажись :)
[19:05:50] <ermine> не эта let f x, но другая
[19:06:57] <gds> её вынести может стоит?
[19:07:57] <ermine> только один logger тогда выносить, чтобы спереди всех модулей стоял, ага
[19:08:56] <gds> получается так.
[19:09:05] <ermine> меня только эстетический вопрос мучает в этой проблеме
[19:09:52] <ermine> из этого кстати вытекает еще одна проблема
[19:10:16] <ermine> если новый модуль назвать logger.ml, то это имя будет конфликтовать с именем библиотеки логгера
[19:10:45] <gds> logger.ml -- твой код?
[19:11:00] <ermine> видимо надо раз и навсегда принять религию "в этой программе/библиотеке все имена файлов должны начинаться с имени проекта"
[19:11:20] <ermine> ну как обычно мой код
[19:12:11] <gds> тогда фокус такой:
module rec Logger = struct .. end
and Some_another = struct .. end
include Logger
include Some_another
[19:13:28] <ermine> слегка не тот случай
[19:13:54] <gds> а чо?
[19:14:26] <ermine> логгер - либла в другом каталоге
[19:15:40] <gds> а в _этом_ каталоге есть модуль, который все всегда открывают?
[19:17:25] <ermine> э, не поняла последней части вопроса
[19:18:40] <gds> ну сейчас у тебя логи идут как-то наподобие logger#print ..., но logger -- значение из модуля из другой диры. Как делаешь его публично-доступным?
[19:19:10] <gds> без префикса модуля, имею ввиду.
[19:22:26] Typhon вышел(а) из комнаты
[19:22:48] <ermine> по идее - из модуля, в котором он создается, new Logger.logger () :) этого модуля видеть в module2 не надо, логически module2 стоит спереди module1, но по контексту инициализировать логгер надо не в module2, а в module1, гы
[19:23:16] <ermine> поэтому просто вынесу и надо назвать sulci_lpg и инклюдить его во все дыры
[19:23:34] <gds> не спеши
[19:27:16] <gds> в общем, как прикидываю. делай функтором, вида
module Logger = GenLogger.Make(struct val чохотят = чонадо end)
а дальше уже разберёшься.
как понял, тривиальными изменениями можно подогнать твою схему под это дело.
или нет?
[19:30:34] <ermine> пока не поняла, надо подумать
[19:30:48] <ermine> я щас компиляю то что написала за три дня без попыток скомпилить
[19:32:18] <ermine> надо подумать, не сделать ли саму module2 функтором
[19:32:50] <gds> ну ты аккуратно с функторами. их дело -- один раз проинициализироваться и молчать всторонку.
[19:35:55] <ermine> ых
[19:38:03] <f[x]> кто-то знает как точно расшифровываются сии камлобилдовские письмена?
# Parallel statistics: { count(total): 12(72), max: 5, min: 2, average(total): 3.333(1.389) }
[19:38:14] <ermine> похоже первая версия этой ботвы будет очень сыромятной
[19:39:54] <ermine> -j?
[19:40:04] <f[x]> да, -j 0
[19:40:25] <f[x]> хочется уверенно чувствовать приятное от того что нашёл эту опцию
[19:40:48] <f[x]> по времени не удаётся заметить сильного ускорения :)
[19:41:33] <ermine> а если -j 4?
[19:41:48] <f[x]> -j 0 это unlimited
[19:42:01] <ermine> а
[19:42:27] <ermine> а все же если -j 3 (поглядев на вывод)?
[19:43:23] <ermine> или даже 2
[19:43:56] <ermine> надо чаю с шоколадным допингом
[19:44:11] <gds> а я вот в кагбэ-отпуск собираюсь. Есть какие-нибудь интересные идеи насчёт верблюдов и около?
конечно, есть проекты, и даже весьма приличные, но всякое бывает в этой жизни.
[19:44:53] <f[x]> оригинальная идея - забыть про верблюдов на время отпуска :)
[19:46:50] <f[x]> btw игнорирование sigpipe не спасает от ENOTCONN в shutdown и соответственно лика сокетов
[19:49:11] <gds> верблюды будут во сне приходить и жалобно мычать :)
с другой стороны, моск чем-то занять надо. кроме верблюдов -- теория категорий, алкоголь, трава, велосипед, да и мебель сделать надо. Но чем это лучше верблюдов..
[19:49:12] <f[x]> -j 2 даёт идентичную статистику и время сборки
[19:49:18] <ermine> у вас калбэки в сигналах вообще вызываются?
[19:49:44] <ermine> я вчера поиграла, у меня сигналы ловятся и дальше как бы идет поведение игнорирования их
[19:50:40] <ermine> я пыталась sigint и sigterm отловить, чтобы в них исполнить at_exit
[19:52:32] <gds> в них надо errorcode выставлять, самый надёжный способ проверить.
[19:53:40] f[x] вышел(а) из комнаты
[19:54:49] <ermine> это как?
[19:54:54] <gds> exit 123
[19:55:13] <ermine> я туда и Pervasives.exit 127 ставила - не реагирует
[19:55:33] <ermine> вот такой тупой пример:
[19:56:15] <ermine> let _ =
Sys.set_signal sigint (Signal_handler (fun _ -> exit127);
while true do () done
[19:56:38] <ermine> и нажми ctrl-c
[19:57:08] <ermine> оно "зависало" у меня
[19:58:44] <gds> начнём с того, что пример не компилируется.
[19:59:33] <ermine> ну я тут по-быстрому набивала
[19:59:44] <ermine> тут flymake нету, да
[20:00:20] <gds> в натив-коде и не будет работать :) сигналы обрабатываются либо между тредами, либо в процессе gc, хотя бы minor. тут его нет.
[20:00:24] <gds> в байт-коде работает.
[20:01:16] <ermine> хмм
[20:01:22] <ermine> да, я в нативе пыталась
[20:01:49] <gds> дело не в байт/натив, а в содержимом цикла.
[20:02:36] <ermine> да, в байткоде пашыт
[20:03:27] <ermine> занятно
[20:04:14] <ermine> а то я заметила что sulci, если ему в консоли дать пинка в виде ctrl-c, ждет каких-нить данных из джаббера, чтобы согласиться вывалиться
[20:05:21] <ermine> негодные сигналы
[20:05:51] ermine обнарудила свежий пост в CWN, похоже лето таки закончилось, ура!
[20:05:56] <gds> ему не хватает minor gc для того, чтобы закончить бренное существование свое. надо major gc или в/в, штоле.
[20:09:12] <ermine> чонить придумаю, спасибо за подсказку
[21:00:36] <ermine> интересно, что за счет усложнения типов можно сократить код
[21:01:22] <gds> _только_ за счёт введения новых типов -- код не сокращается.
[21:02:38] <ermine> я добавила второй параметр в параметрический рекорд :)
[21:03:08] <ermine> таким образом выкинула кучу аргументов у некоторых функций и соответственное таскание аргументов везде
[21:04:27] <ermine> наверняка оно будет работать чуток быстрее за счет того, что аргументов у функций станет меньше 5
[21:10:31] <gds> это не просто типы, это рефакторинг структуры данных!
[21:12:03] <ermine> да еще какой рефакторинг, душа просто поёт
[21:13:39] <gds> во. Так!
оо-нелюди считают рефакторинг чем-то ошибко-подверженным. Так вот, у нас всё круче, ибо типизация.
[21:15:32] <ermine> я пробовала писать код заново, в пустом емаксе, пару раз
[21:15:40] <ermine> не получилось ничего путного
[21:16:07] <ermine> тут с рефакторингом выходит все равно что переписала его заново, но зато путное выходит почему-то
[21:16:56] <gds> в теории -- получилось бы и с нуля, но гемор. Проще ляпать поверх.
А если грамотно расставляешь типы, то вообще няка-вкусняка от этого рефакторинга получается.
[21:18:16] <gds> кстати, я зафейлил писать оракловские (oci) биндинги с нуля, ибо сишный интерфейс страшен, б/п. потратил пол-дня на ловлю бага от луговского, но таки словил.
[21:19:01] <ermine> ты умеешь идеально составлять типы?
[21:19:10] <gds> идеально невозможно.
[21:20:53] <gds> опять же, хитрый вопрос насчёт типизации -- какая же нужна? слишком слабая -- не катит. слишком сильная (где для x/y выводится тип y = int \ {0}) -- тоже не здорово. dependent types -- хорошо, но секаса с ними много (хотя хорошо).
[21:21:36] <604> >бага от луговского,
что за баг?
[21:23:32] <ermine> нужна гибкая типизация!
[21:23:34] <gds> 604: один из самых адских -- неправильно обрабатывал случаи, когда sql binding variable имеет значение NULL. Учитывая прелести OCI (950 страниц A4), было непросто понять.
[21:24:57] <604> http://vshabanov-ru.blogspot.com/2006/10/blog-post_17.html
вы, наверно, это видели, но если не видели, я себе не прощу, что побоялся боян выложить
[21:27:40] sevenov вошёл(а) в комнату
[21:27:42] <gds> не видел. но идея интересная.
[21:27:45] <gds> > А писать окемловкие байндинги для С++ гимор тот еще.
camlidl вроде как умеет.
[21:28:01] <604> а почему именно луговского-то?
[21:28:20] <gds> ну а кто писал oci8ml.
[21:32:12] <gds> кстати, более общий путь решения проблемы (плюсы + плюсы) я зафейлил. чтобы не вспоминать тот адовый пост, приведу выжимку:
"Для объекта obj с полем field должно быть так, что присвоение нового значения (obj->field = new_value) в одном рантайме должно вызывать изменение значения obj->field в другом. Учитывая, что код для доступа к obj->field (который нечто вроде *(this+offset)) уже зафиксирован в библиотеке, и поменять его невозможно, получаем, что требуется совпадение раскладки полей в памяти. Так как я его не могу гарантировать, то вся затея лишается смысла. "
[21:34:04] <604> потрясающе
[21:41:28] sevenov_ вошёл(а) в комнату
[21:41:30] sevenov вышел(а) из комнаты: offline
[22:04:14] gds вышел(а) из комнаты
[22:04:22] gds вошёл(а) в комнату
[22:36:30] <ermine> оо, тельце сульци скомпилилось
[22:36:42] <ermine> щас буду пробовать запускаааать аааа
[23:13:36] <ermine> гыыыыы
[23:13:55] <ermine> ыыыы
[23:16:14] <ermine> есть у меня рекурсивная функция чтения из файла, называется read_file (), там вместо вызова себя для зацикливания стояло read_lone () и я тупила почему программа нихрена не делает
[23:30:18] Genix вошёл(а) в комнату
[23:34:59] Genix вышел(а) из комнаты: offline
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!