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

GMT+3
[00:03:54] <Typhon> кстати, пример "map (+1) [2,2..] == [3,3..]" повесил мне ghci. до сих пор висит сравнивает
[00:04:25] <ygrek> предлагаю травить хаскелль в соотв. конфе - это будет честнее :)
[00:05:09] <Typhon> там народу много, я стесняюсь :)
[00:06:39] ygrek вышел(а) из комнаты
[00:15:07] sceptic вышел(а) из комнаты
[02:33:22] animist вышел(а) из комнаты
[02:33:38] animist вошёл(а) в комнату
[02:35:00] sevenov вошёл(а) в комнату
[02:40:44] Typhon вышел(а) из комнаты
[08:21:20] gds вышел(а) из комнаты
[08:58:07] gds вошёл(а) в комнату
[09:27:20] sceptic вошёл(а) в комнату
[09:31:36] Typhon вошёл(а) в комнату
[09:49:22] <sceptic> очень хочется работать со строкой, как с потоком/массивом символов =/ как это грамотнее организовать?
[09:49:42] sevenov вышел(а) из комнаты
[09:50:13] <gds> Stream.of_string + stream parsers
[09:50:14] <Typhon> camlp4, Streams
[09:50:34] <Typhon> http://gdsfh.dyndns.org/kamlo/camlp4/StreamParsers
[09:50:41] <Typhon> http://gdsfh.dyndns.org/kamlo/Streams
[09:50:56] <sceptic> Typhon: до дыр уже прочитаны статьи эти
[09:51:14] <sceptic> сейчас я делаю так: String.explode "jjam" |> List.map (String.make 1)
насколько хуже это?
[09:51:38] <Typhon> а зачем?
[09:52:33] <sceptic> чтобы перед ^ не преобразовывать. Char же к String нельзя приклеить с помощью ^
[09:52:44] <gds> насколько хуже -- смотря что требуется от кода. если создать список из символов в памяти, то можно и так.
[09:53:05] ygrek вошёл(а) в комнату
[10:11:48] Mon вышел(а) из комнаты
[10:16:34] aloner2k вошёл(а) в комнату
[10:22:46] f[x] вошёл(а) в комнату
[10:27:19] <f[x]> строка это и есть массив символов :)
[10:27:26] <f[x]> можно Enum от строки сделать
[10:30:19] Mon вошёл(а) в комнату
[11:05:05] Typhon вышел(а) из комнаты
[11:11:18] <sceptic> мм.. а с помощью Stream Parsers можно распарсить такую штуку: name.options[.suboptions] ?
[11:12:41] Typhon вошёл(а) в комнату
[11:16:31] <f[x]> вопрос некорректный. можно ли с помощью списков написать программу? Ну можно.
[11:16:43] <f[x]> что значит "такую штуку"? грамматика где?
[11:17:16] <sceptic> сейчас
[11:17:45] <f[x]> если его можно разобрать сверху-вниз - тогда можно написать парсер на стимах который будет это делать
[11:17:59] <f[x]> * на стримах
[11:20:35] <sceptic> [a-zA-Z]\.[a-zA-Z](.[a-zA-Z])* так пожалуй...
[11:20:49] <sceptic> [a-zA-Z]\.[a-zA-Z](\.[a-zA-Z])*
[11:21:44] <gds> как вариант, промежуточным типом может быть [ Dot | Word of string ].
[11:27:02] <f[x]> ну для этого вообще никакой парсер не нужен, разбей по точкам и всё
[11:29:35] <sceptic> у меня строчки вида: module.option: value
[11:32:16] <f[x]> тогда сначала разбить по двоеточию :)
[11:32:22] <f[x]> делай как проще
[11:33:02] sceptic всё равно уже дописал парсер =/
[11:43:39] sevenov вошёл(а) в комнату
[11:44:47] <sceptic> http://codepad.org/gD4X0v88 вот как-то так получается.
[11:48:05] <gds> вроде прилично (если работает).
[12:09:45] ygrek вышел(а) из комнаты
[13:33:09] gds вышел(а) из комнаты
[13:33:39] gds вошёл(а) в комнату
[13:37:57] Typhon вышел(а) из комнаты
[13:41:16] Typhon вошёл(а) в комнату
[13:53:07] ygrek вошёл(а) в комнату
[14:25:28] Typhon вышел(а) из комнаты: Replaced by new connection
[14:25:29] Typhon вошёл(а) в комнату
[14:30:04] ygrek вышел(а) из комнаты: Replaced by new connection
[14:30:06] ygrek вошёл(а) в комнату
[14:37:23] Typhon вышел(а) из комнаты
[14:53:39] sevenov вышел(а) из комнаты: Replaced by new connection
[14:53:48] sevenov вошёл(а) в комнату
[14:54:24] sevenov вышел(а) из комнаты
[14:54:39] sevenov вошёл(а) в комнату
[15:19:29] ygrek вышел(а) из комнаты
[16:16:13] sceptic вышел(а) из комнаты
[16:25:13] sceptic вошёл(а) в комнату
[17:30:57] gds вышел(а) из комнаты
[18:19:54] Typhon вошёл(а) в комнату
[18:27:04] DimitryKakadu вошёл(а) в комнату
[18:40:07] gds вошёл(а) в комнату
[18:52:14] <DimitryKakadu> раз-раз
[18:52:39] <DimitryKakadu> спасибо gds и f[x]!
[18:53:52] <gds> мы были против пиара мужеложества, дело только в этом.
[18:56:13] <DimitryKakadu> такой вопрос: почему при установке камля в /usr/local/lib/ocaml есть map.cmx но нет map.cma и map.cmo?
[18:56:43] <DimitryKakadu> скомпилив ручками map.ml я файл смо получил. Но вопрос интересует.
[18:57:29] <f[x]> map.cmo в stdlib.cma
[18:57:47] <f[x]> а cmx нужен только для оптимизации (инлайны)
[18:59:25] <f[x]> trunk/Changes
- Local opening of modules in a subexpression.
Syntax: "let open M in e", or "M.(e)"
для этого у них время есть, а вот чтобы баги фиксить.. ( http://caml.inria.fr/mantis/view.php?id=4896 )
[18:59:28] <Typhon> http://zabivator.livejournal.com/364173.html тематический срач с непрерывно нарастающим кол-вом комментов
[19:01:19] <f[x]> о, тред - нямка
[19:01:50] <Typhon> только комментарии говнолжешка свернула ( deep-water только спасает
[19:03:12] <f[x]> о неужели?
(оттуда же)
- First-class packages modules.
[19:03:54] <f[x]> Typhon: что такое deep-water?
[19:04:13] <Typhon> http://deep-water.ru/ разворачивалка
[19:05:19] <gds> f[x]: local opening просто уже был сделан кучу раз, и один раз всосать его не сложно.
[19:06:03] <f[x]> (поломав при этом даже не одно расширение, ага?)
[19:08:12] <gds> "First-class packages modules" -- wtf?
[19:08:23] <gds> ну да, многое поломается.
[19:08:48] <f[x]> gds: хз, а вдруг modules as really first-class values?
[19:13:53] <gds> кстати да, тред -- пища! только ленив я в последнее время, чтобы набрасывать. разве что если уж совсем.
[19:14:35] <f[x]> эх, /me влез
[19:14:51] <DimitryKakadu> если я хочу сделать то что в императивных языках называется Dictionary<Key,Value> то мне нужен Map.Make?
[19:15:46] <f[x]> или hashtbl
[19:15:55] Typhon гадает, кто из комментаторов f[x]
[19:15:57] <gds> да, смотря какое нужно, функциональное или императивное.
[19:16:40] <Typhon> справделивости ради, (a * b) list и List.assoc тоже может хватить
[19:17:19] <DimitryKakadu> а что gds имелл ввиду когда говорил "функциональное или императивное"?
[19:17:42] <gds> map / list -- функциональное, hashtbl -- императивное.
[19:17:46] <Typhon> мутабельное иммутабельное?
[19:18:06] <gds> ага, так.
[19:18:07] <Typhon> (розенталь меня не любит сейчас)
[19:21:57] <DimitryKakadu> Напишу с List.assoc, ну ихнафиг эти фанкторы
[19:22:15] Typhon вышел(а) из комнаты: Replaced by new connection
[19:22:18] Typhon вошёл(а) в комнату
[19:22:37] <gds> ну и правильно, List.assoc -- приличный вариант, по крайней мере, сначала.
[19:22:40] <Typhon> сбил человека с пути знаний :(
[19:22:42] <Typhon> я
[19:23:01] <gds> как будет тормозить код, человек вернётся на путь знаний.
[19:23:22] <DimitryKakadu> скорее всего до тормозов кода не дойдет
[19:23:35] <DimitryKakadu> у меня не очень сложные тесты будуь
[19:24:39] <gds> кстати, советую обернуть:
let assoc_opt key alist = try Some (List.assoc key alist) with Not_found -> None
или как-то так. Чтобы не ловить исключения на каждый чих.
[19:25:22] <DimitryKakadu> ща попробуем
[19:25:29] Typhon вышел(а) из комнаты: Replaced by new connection
[19:25:32] Typhon вошёл(а) в комнату
[19:29:42] <gds> зарекалась свинья говна не жрать, что называется :) пару каментов присунул, но хозяин журнала их скринит по умолчанию. как раскроет, так и будет видно.
[19:31:12] <gds> (а, это не по умолчанию, это из-за наличия ссылок, сейчас в жыжыцэ это модняво)
[19:32:10] <Typhon> кстати, как исключения вписываются в систему типов окамла? мне как-то не очень нравится, что я могу объявить let а s = raise (Failure s) и получить типа string -> 'a , а не exn какой-нибудь. типа "чую, что чертовщина, но обосновать не могу"
[19:34:45] Typhon вышел(а) из комнаты: Replaced by new connection
[19:35:13] Typhon вошёл(а) в комнату
[19:35:29] <f[x]> checked exceptions нетути
[19:35:41] <f[x]> но есть ocamlexc пощупать который я всё хочу но не успеваю
[19:36:09] <Typhon> а стандартные как вообще уживаются с системой типов? куда почитать можно?
[19:36:31] <gds> просто Failure s будет : exn, а вот raise таки имеет тип "что в других ветках присунули, то и есть я". А как иначе запишешь
if 1=1 then 1+2 else raise (Failure "wtf???")
[19:38:09] <gds> исключения кидаются только при применении аргумента к функции, и функция либо возвращает значение (которое имеет нужный тип), либо не возвращает значения вообще (если кинули и не словили), и тогда кагбэ и думать не надо, какого типа значение она не возвратила.
[19:39:35] <Typhon> а, то есть тайпчекер вообще забивает по сути не ветки, где есть raise ?
[19:40:03] <gds> скажем, raise : exn -> 'a, поэтому считает, что 'a может унифицироваться до чего ему потребуется.
[19:41:01] <Typhon> угу, это понятно. а самому (исключительно из интереса) можно ли реализовать sometype -> 'a ? у меня пока в голове сходу не придумывается
[19:41:16] <gds> есть и ocamlexc, и более простой подход, вида
type ('r, 'e) res = [ `Ok of 'r | `Error of 'e ]
(если не ошибся в original syntax), и функции вида
let ret x = `Ok x
let bind a mb = match a with `Ok r -> mb r | `Error e -> `Error e
[19:41:40] <ermine> опять какие-то дятлы оттуда ко мне в приват полезли насчет банов
[19:41:53] <f[x]> gds: угу, НО. гарантии где?
[19:41:54] <gds> sometype -> 'a и не должен придумываться :) hurry-coward isomorphism однако :]
[19:42:11] <gds> f[x]: гарантии чего?
[19:43:06] <Typhon> shit. gds, вторая демотивация за сегодня :) чуть ранее сортирнул книжки "которые я обязательно когда-нибудь прочитаю" по теории типов и related :)
[19:44:54] <gds> не, по теории типов читать надо независимо от всякой фигни. Мало ли что я скажу тут -- а вдруг обману? :)
[19:45:18] <gds> просто конкретно это -- не такой уж интересный вопрос, имхо.
[19:45:29] <Typhon> это да, tapl первый на очереди
[19:47:48] <f[x]> gds: гарантии того что exception не вылезет туда гле я его не жду
[19:48:31] <f[x]> т.е. монада это хорошо, но я могу унутре сказать raise и привет
[19:49:59] <gds> иногда я делал функции вида:
let apply1 f x = try `Ok (f x) with e -> `Error (`Exn e))
конечно, гарантий никаких, спорить не буду.
[19:57:18] <gds> Typhon: кстати, в оверблде сделал таки "--without-gui" опцию configure, если чо. Не требует tcl/tk, не билдит библиотеку labltk в окамле, не билдит lablgtk2. Потестил на одной вендовой машине, работает.
[19:57:37] <Typhon> о, ща у себя проверю
[19:58:07] <gds> пушил и на sf, и на ocaml forge.
[20:01:07] <Typhon> C:\OcaML\overbld>hg up
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
[20:01:10] <Typhon> с sf
[20:02:47] <gds> hg pull был?
[20:03:08] <Typhon> оу нет :[
[20:03:16] <f[x]> http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocaml/trunk/test/fstclassmod.ml?rev=9397&view=markup
[20:05:25] <gds> f[x]: сурово они это.
[20:06:30] f[x] гарантирует истерики "ocaml is so overloaded with features and magic syntax"
[20:12:05] <gds> о да :) зато столько всего интересного подкинули! new type пока ниасилил по примерам. с модулями же -- ок! ещё надо их типы поразглядывать, и вообще, всяко поиграться.
[20:14:32] <f[x]> а этот new type в комплекте с модулями используется
[20:14:37] <f[x]> видел функцию make_set?
[20:15:00] <f[x]> это же просто сказка
[20:15:31] <gds> make_set -- о да!
[20:28:48] f[x] вышел(а) из комнаты
[21:29:35] <Typhon> gds: это нормально, что я говорю ./bld extlib, а он заодно камл собирает? ща первый раз с префиксом c:/ocaml не смог создать bin/ocanlrun.exe (permission denied) и на этом кончился (еще не смотрел, почему denied), а с префиксом c:/ocaml/tst поставил extlib и камл (или bld просто копирует туда что нужно?)
[21:32:35] <gds> ./bld extlib -- да, собирает по зависимостям. Опять же, всё дело пошло из истории (из начальных требований) и патчей окамла. Без этого нельзя было гарантировать, что всё соберётся и будет работать нормально.
про denied -- непорядок, интересно.
если указать префикс -- создаст структуру директорий, скопирует туда flexdll, скомпилирует окамл, поставит его туда, и дальше по зависимостям (что указали в опциях bld, или всё доступное по умолчанию)
[21:33:11] <gds> когда стал прикидывать изначально вариант "реюзать уже инсталлированный окамл", сложности вылезли. Например, на моих же локальных машинах -- хотел свежее всегда иметь.
[21:34:59] <Typhon> про denied я понел -- мой тупняк -- toplevel запущен был, я не думал, что он собирать будет, ну ок, если это нормальное поведение, ща цивилизованно соберу
[21:35:42] <Typhon> кстати, если вдруг какие баги будут в оверблде в чятик писать или какое иное место культурное?
[21:37:46] <gds> лучше собирать в другую диру на всякий случай (хотя конкретно оверблд поверх него же ставилось нормально вроде).
[21:40:17] <gds> видимо баги лучше на sourceforge таки. сейчас разберусь там с багтрекером и сообщу.
[22:08:05] <gds> какой-то слегка пришлёпнутый там багтрекер :)
однако, тем не менее, это лучше, чем уламывать французского господина.
вот этот урл -- для багов оверблд: http://sourceforge.net/tracker/?func=add&group_id=280863&atid=1191746
оттуда шлётся мне в мыло, которое я смотрю по частоте не реже жаббера.
[22:08:25] <Typhon> писал тебе сюда месагу, но пойду тогда там обновлю )
[22:10:14] <Typhon> спасибо за проект :) все собралось и заработало.
[22:10:55] <gds> оппа! шоке.
[22:14:18] <Typhon> :) ладно, в трекер не буду пока, ибо не уверен, что у меня тут баг или что-то вроде: после установки для того чтобы пользовать extlib пришлось в топлевеле расширить пути поиска либ (#directory c:/ocaml/lib/site-lib/extlib/) только после этого загрузилась либа. я заметил там set-vars.bat, но там нету ни site-lib ни extlib, может с помощью него добавлять с OCAMLLIB пути к установленным пакетам?
[22:17:16] <gds> да лучше подозрительное по-любому в трекер писать, игнорировать не буду уж точно.
касаемо extlib -- пытался держать findlib-консистентную штуку.
cmd /K set-vars.bat , затем ocaml, затем в топлевеле что-то вроде
# #use "topfind";;
# #require "extlib";;
проверил на старой версии, получилось.
[22:17:52] <gds> (но тут подозрительное оказалось просто findlib-специфичной штукой)
[22:19:56] <gds> ну или же
ocaml -I +site-lib/extlib
# #load "extLib.cma";;
оба варианта потестил, в топлевеле работает "module E=Enum;;" например, дальше тестить не стал. Если что найдётся, буду фиксить. А может и найтись, так как я топлевел юзаю мало.
[22:21:14] <Typhon> -I эквивалентен #directory в топлевеле, емнип, так работает, просто думал, может круто автоматом добавлять в пути поиска либ, чтобы все круто было? )
[22:25:31] <gds> если бы они в теории не конфликтовали ни при каких условиях, не перекрывали модули друг друга и не вызывали бы сайд-эффектов при загрузке, было бы точно круто. Из-за перекрытий -- стрёмно.
В таком случае лучше уж батарейки забилдить, там у них с топлевелом (и с организацией библиотек) гораздо лучше дело обстоит. (как раз с теми вещами, где мне уж точно не хочется повторять их работу.) Вот над этим буду думать.
[22:26:37] <Typhon> ясно, пути добавлять не лениво в принципе, крутости это не отменяет :)
[22:26:39] <gds> хотя, если добавлять чисто пути, и озаботиться, чтобы в начале испытывались пути stdlib'а и прочих окамловских библиотек, было бы неплохо.
[22:27:15] ygrek вошёл(а) в комнату
[22:27:30] <gds> в общем, пока решение -- #use "topfind" и прочий findlib. Если запарит, будем думать.
[22:28:43] <gds> интересно, а как культурные люди (т.е. все кроме меня) юзают топлевел со всякими extlib и прочими гламурными библиотечками? custom toplevel собирают что ли на каждую библиотеку?
[22:29:53] <Typhon> я не считаюсь за культурных, но я планирую собрать кастомный, с нужными либами (unix, extlib и выбрать что-нибудь легкопоточное)
[22:38:33] ygrek прописывает в .ocamlinit часто используемые либы (это работает как для системного ocaml, так и в случае локального файла для кастомного топлевела)
[23:30:24] <ygrek> ооо, каких только идиотов в этих интернетах не водится, тред доставляет
[23:33:38] <gds> дада, vsl-mode on
[23:34:33] <ygrek> ага, увидел
[23:49:50] DimitryKakadu вышел(а) из комнаты
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!