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

GMT+4
[00:00:25] <gds> лично для меня -- непредсказуемость кода. как перегрузка операторов в плюсах. ты только думаешь, что всего лишь складываешь два числа оператором сложения...
[00:02:41] <sceptic> Всегда же можно посмотреть, что выводит типовыводилка.
[00:04:32] <gds> отсутствует code locality (или хз как правильно называется): возможность разобраться в том, что на самом деле делает код, на основании как можно меньшего количества действий, видя исходник. в окамле обычно достаточно видеть сам код и видеть объявления всех текущих открытых модулей для разбора полётов.
[00:06:23] <gds> впрочем, можно либо использовать объектную систему окамла (мощная штука), либо взять синтаксическое расширение deriving, либо самому использовать функторы, которые вполне приличная штука. все варианты хороши.
[00:08:21] <sceptic> надо попробовать.
[00:20:38] <sceptic> А как целиком файл считать?
[00:24:18] <gds> обычно файлы -- это такие большие штуки, которые могут не поместиться в памяти. это точно нужно?
[00:25:01] <sceptic> Я точно уверен, что файл поместиться в память.
[00:25:39] <gds> считывать побайтово или построчно?
[00:25:54] <sceptic> хотя если с файлом работать как с ленивым списком строк..
[00:26:08] <ygrek> Std.input_file
[00:28:30] <gds> лень вылезает боком. это мне хаскеллисты рассказали. кто я такой, чтобы им не верить.
[00:51:15] ygrek вышел(а) из комнаты
[00:53:33] <sceptic> хм.. Что-то я не соображу, а как подключить Std из extlib? пишу open Std;; в toplevel а оно мне unbound module
[00:55:17] <gds> #load "extlib.cma";;
[00:55:46] <gds> однако может понадобиться ещё
#directory "дира"
(хз, я в топлевеле мало разбираюсь)
[00:55:47] <sceptic> # #load "extlib.cma" ;;
Cannot find file extlib.cma.
[00:55:57] <sceptic> А если в обычном коде?
[00:56:32] <gds> в обычном -- указать диру, где extlib живёт. "-I дира", например.
[00:56:43] <gds> в топлевеле тоже, кстати.
[00:58:04] <sceptic> А разве оно по умолчанию не ищет в /usr/lib/ocaml/ ?
[00:58:21] <gds> я не знаю, куда по умолчанию ставится extlib.
[01:01:05] <gds> у меня проканало так:
$ ocaml -I +site-lib/extlib
        Objective Caml version 3.11.1
# #load "extLib.cma";;
# Std.input_file;;
- : ?bin:bool -> string -> string = <fun>
[01:02:36] <gds> если компилировать, и если посредством ocamlfind, то
ocamlfind ocamlc -package extlib -linkpkg source.ml -o executable
[01:04:16] <gds> дальше предоставлю возможность поковыряться самостоятельно, ибо /me спатке.
однако, ничего сверхъестественного быть не должно с extlib. максимум, что плохого сделаешь, так это реализуешь уже имеющийся функционал или захардкодишь пути. оба вопроса -- фигня.
[01:56:03] Typhon вышел(а) из комнаты
[04:56:32] gds вышел(а) из комнаты
[04:57:03] gds вошёл(а) в комнату
[05:11:48] gds вышел(а) из комнаты: Replaced by new connection
[05:11:49] gds вошёл(а) в комнату
[08:36:59] john вошёл(а) в комнату
[08:55:37] aloner2k вышел(а) из комнаты: Replaced by new connection
[08:56:04] aloner2k вошёл(а) в комнату
[09:21:37] Typhon вошёл(а) в комнату
[09:24:10] <sceptic> А есть ли какой-нибудь аналог ** для целых чисел?
[09:44:44] <gds> вроде нет ничего стандартного.
[09:48:14] <sceptic> сделал такую штуку.. вроде работает, но варнинги плюёт.
let pow_int x = function
0 -> 1
| n when n > 0 ->
let rec to_power x = function
1 -> x
| n when n mod 2 = 0 -> (to_power (x * x) (n / 2))
| n -> x * (to_power x (pred n))
in to_power x n
[09:52:26] <gds> принцип правильный, а варнинги -- от того, что окамл не может доказать, что все ветки будут выполнены и нет лишних.
[09:55:20] <gds> можно как-нибудь так, но на любителя:
let rec pow_int x n =
  if n = 0
  then 1
  else
    if n mod 2 = 0
    then pow_int (x*x) (n/2)
    else x * (pow_int x (n-1))
;;
а ещё правильнее было бы сделать хвостовую рекурсию, но это непринципиально, пока профайлер не докажет.
[09:57:17] <sceptic> А как мне строки пронумеровать? В хацкеле я делал так: zipWith (\x y -> "Case $" ++ show x ++ ": " ++ y) [1..]
[09:59:54] <gds> extlib'овский List.iteri
[10:13:15] gds вышел(а) из комнаты
[10:18:20] f[x] вошёл(а) в комнату
[10:21:12] <sceptic> http://codepad.org/OtzOFUTN что я делаю не так в 15 строке?
[10:24:27] <f[x]> to_decimal это функция двух аргументов
[10:25:10] <sceptic> тьфу
[10:25:17] <f[x]> и матчинг с pos делает не то что ты думаешь
[10:25:18] <sceptic> забыл pos из объявления убрать
[10:25:36] <sceptic> let rec to_decimal = function вот так должно быть
[10:26:10] <sceptic> Научите List.iteri из ExtLib..
[10:27:49] <f[x]> должен быть варнинг что этот match case is unused
[10:36:29] animist вышел(а) из комнаты: Replaced by new connection
[10:36:33] animist вошёл(а) в комнату
[11:48:47] john вышел(а) из комнаты
[11:49:11] gds вошёл(а) в комнату
[11:49:47] john вошёл(а) в комнату
[12:31:56] f[x] вышел(а) из комнаты
[12:34:37] f[x] вошёл(а) в комнату
[12:50:25] Typhon вышел(а) из комнаты
[12:50:33] Typhon вошёл(а) в комнату
[13:18:33] john вышел(а) из комнаты
[13:22:03] Typhon вышел(а) из комнаты
[14:48:21] animist вышел(а) из комнаты: offline
[14:54:33] animist вошёл(а) в комнату
[14:55:44] john вошёл(а) в комнату
[15:22:37] f[x] вышел(а) из комнаты: Replaced by new connection
[15:22:38] f[x] вошёл(а) в комнату
[16:19:46] <f[x]> ну и конечно дебиановцы своими шаловливыми патчиками немножко поломали jocamlmktop
[16:26:45] <ermine> f[x]: как там твой sqlgg? опять думаю начать прилаживать к новой сульце :) там нет критических изменений в апи?
[16:27:06] <ermine> надо обновить гит, кстати
[16:31:22] <ermine> запуллила
[16:34:47] <f[x]> вроде ничего особо не менялось
[16:35:30] <f[x]> если старый патч не покатит -- на выходных обновлю
[16:36:17] <ermine> не покатит просто приложить патч :) надо просто освоить
[16:37:12] <f[x]> :)
[16:50:26] <ermine> только неудобно делать это делая сразу три разных дела
[16:55:37] <ermine> f[x]: а туториала у тебя ессно нет?
[16:55:56] <f[x]> ессно
[16:55:59] <f[x]> в todo
[16:56:11] <ermine> в вики надо
[16:56:16] <ermine> :)
[16:56:26] <ermine> можно попробовать пописать вику по ходу ковыряния
[16:57:50] f[x] намёк понял, поднимает приоритет туториалу
[16:58:34] <ermine> ну да, будешь ведь подсказывать
[16:59:31] f[x] чего-то не понял где в этом хвалёном мойне openid?
[17:00:01] <gds> f[x]: дойду до дома, буду ковырять. видишь ли, lazy evaluation..
[17:00:24] <ermine> гг
[17:00:31] <ermine> фичи - по запросу
[17:00:39] <gds> ну да. чтобы не перетрудиться.
[17:01:06] <f[x]> let () = let login = Lazy.force openid in create_page login "JoCaml"
[17:01:22] ermine смотрит в пропатченный plugin_talkers.ml и думает, что он непатченный
[17:02:18] <ermine> хм, видимо не в тот каталог смотрю
[17:03:19] <ermine> ага!
[17:05:55] <gds> раскрою секрет :) пока оно не проверяет на валидность емыла.
[17:07:38] f[x] хочет openid
[17:08:35] <ermine> f[x]: а ты откуда опенидом логинишься?
[17:08:56] <ermine> gds: вроде в опениде и нет емыла
[17:09:45] <gds> в общем, всё ясно. дома буду ковырять.
[17:10:08] <f[x]> т.е. откуда? провайдер myopenid
[17:30:16] gds вышел(а) из комнаты
[17:59:31] animist вышел(а) из комнаты
[17:59:47] animist вошёл(а) в комнату
[18:23:23] sevenov вышел(а) из комнаты
[18:30:07] gds вошёл(а) в комнату
[19:07:30] <gds> f[x]: тестируй.
[19:07:40] <gds> мда, для настройки мойна нужен личный питонье.
[19:13:35] <ermine> чо?
[19:13:47] <gds> чочо попячса!
[19:14:09] ermine приладила апи плагина-жертвы и теперь совсем готова приступить к освоению sqlgg
[19:15:54] <gds> интересно, http://botbouncer.com/ для вики включать стоит?
[19:17:47] <ermine> а что это?
[19:18:02] f[x] вышел(а) из комнаты
[19:18:13] <gds> удостоверяет, что обладатель openid хоть раз заполнил капчу.
[19:18:16] <ermine> ты еще включи торрент, чтобы мало не было
[19:19:02] <ermine> вот только интересно, на каком этапе у тебя вики тормозит - на пути к тебе по проводам или уже у тебя на машине?
[19:23:57] <gds> с локалхоста -- порядка 3 секунд превью мелкой статьи делается, с полной загрузкой проца. допустим, фаерфокс тоже кушает немало.
то есть, цги показывает себя по полной.
[19:29:16] <ermine> тормозливо, тоскливо
[19:29:35] <ermine> щас создам минимальный пример с sqlgg
[19:30:15] <gds> да, тормозит. а кто говорил, что мойн идеален и вообще постоянное решение.
[19:30:46] <gds> лол, в гугле "ocaml faq" в первой десятке кажет мою жыжыцу с коанами :)
[19:32:40] <ermine> передирай!
[19:33:47] <gds> эээ, чо?
[19:34:16] <ermine> камлофак
[19:35:39] <gds> факи систематизировал: http://gdsfh.dyndns.org/kamlo/OCamlFAQ
передирать влом.
разве что местечковый филиал открыть. вон про порядок исполнения, например.
[19:38:26] ermine уже начинает соображать, как едят sqlgg
[19:38:39] <ermine> ну, это стоило еще упростить
[20:25:52] ermine запостила первый кусок в вику
[20:29:55] animist вышел(а) из комнаты
[20:30:12] animist вошёл(а) в комнату
[20:41:16] <ermine> и второй кусок
[20:41:23] <ermine> теперь бы все это скомпилить
[20:51:28] <gds> нашёл сборище фоток математиков. если брать его пересечение с окамлом и около, получим:
http://andrej.com/mathematicians/B/Bauer_Andrej.html
http://andrej.com/mathematicians/C/Cardelli_Luca.html
http://andrej.com/mathematicians/C/Coquand_Thierry.html
http://andrej.com/mathematicians/D/Danvy_Olivier.html
(этот тут вообще случайно затесался: http://andrej.com/mathematicians/L/Lamport_Leslie.html )
http://andrej.com/mathematicians/P/Pierce_Benjamin.html
[21:29:02] ermine с интересом смотрит на sqlgg.byte размером 0 байт
[21:35:16] <ermine> по дефолту оно генерит код для с++, какой ужас
[21:42:31] <ermine> в доке ни слова про то как получить камлевый код
[21:44:21] ygrek вошёл(а) в комнату
[21:48:16] <ermine> ygrek: как компилить окончательный код? оно хочит sqlgg_traits.m
[21:48:29] animist вышел(а) из комнаты: Replaced by new connection
[21:48:31] animist вошёл(а) в комнату
[21:50:19] <ygrek> я просто в проект traits добавляю. не технологично - но работает
[21:50:48] <ygrek> ermine: с++ исторически сложился :)
[21:51:38] <ermine> ygrek: погляди в вику, я слегка набросала
[21:51:47] <ermine> про traits там пока нету
[21:52:35] <ermine> ygrek: а вот если запустить просто sqlgg без аргументов, то ничо не будет
[21:53:02] <ermine> в ридми написано запускать ./build, которого тоже нэту
[21:54:29] <ygrek> gds: и pierce такой молодой :)
[21:55:15] <gds> во, я тоже офигел аж.
[21:55:24] <ygrek> ermine: у меня в readme написано src/build
[21:55:35] <ygrek> а у тебя что за readme? ;)
[21:55:56] <ygrek> да, при пустом запуске надо будет хелп выдавать, поинт
[21:56:14] <ermine> а у меня лежит build.bat
[21:56:40] <ygrek> а, точно
[21:56:49] <ygrek> проглядел, исправлю, спасибо
[21:56:52] ermine с ходу не видит, откуда взять недостающий модуль
[21:57:13] <ygrek> traits'ы в impl
[21:58:17] <ermine> ой, похапэ детектед
[21:58:35] <gds> traits -- из плюсового мира термин?
[22:00:10] <ygrek> угу, ничего лучше не придумалось
[22:00:26] <ygrek> точнее из смоллтока
[22:01:14] <ygrek> ermine: ага, но как оказалось для динамических языков толку от такого подхода ноль
[22:01:49] <ygrek> gds:
> Anonymous sessions need to be enabled for OpenID login.
[22:02:02] <gds> ун моменто, побежал фиксить.
[22:02:05] <ermine> хм, кудато делось Make модуль
[22:02:15] <ermine> правда я его из патча копировала
[22:02:44] <ermine> ygrek: Make неактуально ужо?
[22:02:53] <ermine> пример строки с Make в вики
[22:04:18] <ermine> и sqlgg_sqlite3 на дороге не валяется
[22:04:31] <ygrek> ermine: хм, да, теперь модуль называется Sqlgg, можно -name make сделать
[22:04:43] <ygrek> не помню зачем поменял, Make имхо лучше
[22:04:48] <ermine> ваще интерфейс поменялся
[22:04:59] <ygrek> impl/sqlgg_sqlite3.ml
[22:05:25] <ermine> та я вижу
[22:05:55] <ermine> ой оно ж hpp
[22:06:13] <ermine> я про sqlite3
[22:06:44] <ermine> кого теперь указывать в аргументе к сгенеренному модулю?
[22:07:14] <gds> ygrek: спробуй ще
[22:08:15] <gds> а почему для динамических языков sqlgg не ок?
[22:09:08] <ermine> gds: это каких динамических? похапэ?
[22:09:30] <gds> ermine: "(21:01:22) ygrek: ermine: ага, но как оказалось для динамических языков толку от такого подхода ноль"
[22:10:39] <ygrek> gds: потому что идея в том что компилятор проверяет соответствие типов (и имён) аргументов при использовании сгенерированного кода
[22:11:33] <ygrek> а у динамических языков компилятор ничего не проверяет - будет в рантайме ошибка
[22:15:01] <ygrek> ermine: там есть и ml для sqlite
[22:15:21] <ermine> ygrek: да я уже правлю код дальше
[22:15:24] <gds> лучше ошибка в рантайме вида "нет такого поля ... в такой-то таблице: ..." вместо "undefined value at ... module-that-executes-sql". На основной работе, где кода слишком много, и бОльшая его часть это говнокод на плохо-типизированных языках, я немало делаю для быстрой диагностики ошибок.
[22:17:17] <ygrek> согласен
[22:18:09] <ygrek> я это только из интереса смотрел, use-case'ов нет
[22:19:12] <ermine> функции test_* нифига не булевые
[22:19:55] <ermine> ygrek: есть возможность сделать булевую из select 1 from table where aa=bb?
[22:20:54] <ygrek> булевых функций пока нет вообще
[22:21:44] <ygrek> сделай select count(*) from table where ... - он выведет что в результате одна строка и назначит тип int option
[22:22:14] <ermine> 1 быстрее чем count(*)
[22:22:17] <ygrek> а в коде Option.is_some - вот и буль :)
[22:22:28] <ygrek> ну тогда limit 1 допиши в конец :)
[22:22:37] <ygrek> надо будет константы тоже детектить, кстати
[22:22:42] <gds> во мне поднимается реляционщик, который говорит, что count(*) вместо exists -- это неграмотно.
[22:22:59] <ygrek> gds: как правильно?
[22:23:25] ygrek лихорадочно строчит в todo
[22:24:12] <ermine> gds: ладе на jabber.ru count(*) не используется для подсчета сколько регистренных юзеров есть :)
[22:24:32] <ermine> он слишком тормозен
[22:25:10] <gds> для оракла -- select .. from dual where exists (...) либо select .. from the_tables where rownum < 2 -- это выполняется быстро, оптимизатор распознаёт. для остальных субд -- ну, mysql вообще с оптимизатором не дружит, nested loops и превед, поэтому там limit 1 будет самое то. sqlite, честно, не ковырял нормально.
[22:26:11] <gds> ermine: ну, count(*) из одной таблицы вполне может оптимизироваться, так что не всё так однозначно.
[22:28:04] <ermine> ygrek: твой чудопупер sqlgg не задетектил ошибку в test.sql
[22:28:28] <ermine> ygrek: посмотри на последнюю строчку в test.sql в вики, там забыта запятая
[22:31:00] <ermine> и чо делать с этим селектом, тоже неясно, не работает в
let sql = Sql.select_words db ~categ:"verb" ~limit:1L in
let stmt = prepare db sql in
ругается
(Sqlgg_sqlite3.text -> Sqlgg_sqlite3.num -> unit) -> unit
but an expression was expected of type string
[22:31:26] <ermine> правда у меня щас мозги уже отключились
[22:33:02] <ermine> ааа
[22:33:13] ermine включала моск на 5 минут
[22:33:24] <ermine> оно уже вычислило
[22:33:30] <ermine> а не дает строку
[22:35:12] <ermine> ладно, продолжим завтра, а щас я пойду нафик
[22:43:16] sevenov вошёл(а) в комнату
[22:49:47] <ygrek> select word counter from это валидный sql :))
[22:50:09] <ygrek> эквивавлентно select word as counter from
[22:52:04] <ygrek> что дальше с select'ом делать - передать функция для итерирования по рядкам, весь код что там напрямую с sqlite работает можно (нужно) убрать
[22:52:58] <ygrek> gds: залогинился
[22:59:46] <ermine> ygrek: завтра допилю, спасибо
[23:04:26] <ygrek> ermine: тебе спасибо :)
[23:44:19] <ygrek> обновил код на вики
[23:54:48] <gds> постулирую. та штука, которая нужна для того, чтобы "код, который работает у меня", использовался людьми, вызывается как минимум написанием пары слов для туториала+примера.
даже я, будучи лентяем, сходу готов скопипастить пример и итеративно доточить напильником до нужного кода (когда мне понадобится sql в окамле).
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!