Home
Objective Caml
ocaml@conference.jabber.ru
Четверг, 18 августа 2011< ^ >
f[x] установил(а) тему: Камль -- http://caml.inria.fr | http://camlunity.ru/ (теперь с git доступом!) | Верблюды грязи не боятся! | release crap, enjoy NIH | репортьте баги официальным дилерам | ocaml мёртв и тормозит, move on | stdlib only? - ССЗБ
Конфигурация комнаты
Участники комнаты

GMT+4
[00:00:44] <Kakadu> я кажется придумл частное решение. ща
[00:00:56] <ermine> можно вручную химичить через хэштабло, где ключ один класс, значение другой класс
[00:01:46] <ermine> да почитай лучше на ночь грядущую, Дездемона, соответствующую главку Корана^Wмануала
[00:05:27] <gds> есть нотация "#classtype", и может можно "constraint 'a = #'b", но навряд ли.
[00:07:10] <Kakadu> gds: про #classtype в мануале где?
[00:07:23] <gds> точно -- в спецификации языка должно быть.
[00:08:53] <ermine> да есть
[00:08:59] <gds> однако, если требуются такие серьёзные ограничения, как подтипизация параметров типов, вероятно, стоит по-серьёзу взяться за мануал, а то и пропатчить что-нибудь, дописать что-то к выводу типов.  Как и мне, собственно, но про другое дело.
[00:09:02] shaggie вышел(а) из комнаты
[00:09:48] <gds> кстати, ещё можно посмотреть, как в х-е работают с подклассами.
[00:09:55] <ermine> да может лучше коварианты и прочий полиморфный вариантизм
[00:10:23] <ermine> а классы - от лешего
[00:10:52] <gds> вот не надо про классы.  удобно, если в меру.
[00:11:12] <gds> даже несмотря на то, что мера приблизительно равна нулю.
[00:11:34] <Kakadu> )
[00:13:05] <ermine> lablgtk2 фактически единственная красивая мера, не равная нулю
[00:14:40] <gds> ermine: нене, во внутренних разработках уже было, кое-что публиковал в жыжыцэ (про сериализацию класс был), и многое будет в кадастре.  Ты его потенциал не оценила.  Да, рантайм-диспетчинг, но какова сила!
[00:15:39] <Kakadu> gds: кадастре?
[00:18:14] <gds> Kakadu: https://bitbucket.org/gds/cadastr/src , но там пока мало.  И оттуда можно вынести разве что такие вещи: 1. class types лепить в целом не надо, зачем, ограничивать ими и выкидывать остальное?  2. inherit нужно очень редко, ибо сложные штуки им не сделать.
[00:23:36] <ermine> gds: а чо такое странное имя?
[00:24:00] <ermine> кадастратор
[00:24:49] <gds> ermine: имя чоткое.  "кадастр" = "реестр", с другой стороны "CAml DAta STRuctures".  Это Typhon придумал, и очень хорошо вышло, на мой взгляд.
У меня из левых ассоциаций только каподастр.
[00:26:14] <gds> вот конкретно сейчас думаю загнать в кадастр беготню по файловой системе.  Однако так, чтобы в худшем случае строить всё поддерево в памяти -- это мне не нужно.  Думаю над альтернативами.  Плохо, что иногда нужно map, иногда fold.  Но как раз в эту сторону я их заборю.
[00:27:53] <gds> про "строить дерево" -- это я про кадастр сам по себе.  Конечно, программа, вызывая map identity fs всяко должна получить это дерево, но либа не должна его строить тогда, когда оно не нужно.
[00:28:38] <ermine> gds: caml? какое-то устаревшее слово
[00:39:43] Kakadu вышел(а) из комнаты
[01:36:27] ermine вышел(а) из комнаты
[02:07:35] gds вышел(а) из комнаты
[02:36:25] Typhon вошёл(а) в комнату
[03:01:12] zinid вошёл(а) в комнату
[03:05:14] digimmortal вошёл(а) в комнату
[03:47:31] digimmortal вышел(а) из комнаты
[04:01:51] Typhon вышел(а) из комнаты
[08:35:15] iNode вошёл(а) в комнату
[09:26:11] Kakadu вошёл(а) в комнату
[09:30:45] ermine вошёл(а) в комнату
[09:54:26] <bobry> # type ('a, 'b) f = 'a -> 'b;;
type ('a, 'b) f = 'a -> 'b
# let fmap g x = fun y -> g (x y);;
val fmap : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
[09:54:31] <bobry> вроде оно
[10:03:21] bobry вышел(а) из комнаты
[10:09:52] <Kakadu> почему это компилится?
# class c0 = object method m = {< >} method n = 0 end;;
[10:10:06] <Kakadu> что такое {< >}?
[10:18:58] <Kakadu> мдя, ну и ооп
[10:38:34] <ermine> в мануале написано
[10:39:47] <ermine> Kakadu: породить новый объект внутри объекта
[10:40:03] <Kakadu> я что-то встретил какое-то объяснение уже после использования...
[10:40:24] <Kakadu> ну да, более менее понятно
[10:41:21] <ermine> Kakadu: возьми да почитай весь мануал
[10:41:33] <ermine> всего две главы - 6 и 7
[10:41:59] <Kakadu> ermine: их всего 5 же
[10:42:17] <ermine> две
[10:42:24] <ermine> коре язык и расширения
[10:43:19] <Kakadu> всё, понял
[10:45:49] bobry- вошёл(а) в комнату
[10:46:30] <bobry-> ох, а в lyah прямым текстом написано что fmap для (-> r) это (.)
[10:50:04] <ermine> bobry-: видишь, как полезно хотя бы один туториал дочитать до конца!
[10:50:57] <bobry-> ermine: ну про функторы я там много раз перечитывал, вылетело из головы
[10:58:44] gds вошёл(а) в комнату
[11:13:22] <f[x]> > The last good thing written in C was Schubert's Ninth Symphony.
[11:17:09] <gds> чотко.  И про до-диез-мажор и фа-диез-мажор тоже должны быть подобные изречения, чисто для полноты.
[11:19:06] <gds> bobry-: не проверял точно твой fmap, но сама идея верная, это композиция.  А теперь следующая задачка -- найти определение (например, на ncatlab.org) и составить контрвариантный функтор "( x -> _ )".
[11:29:32] <gds> во.  Вопрос.  Представим, что есть "способ генерировать дерево".  Например, функция, для каждого узла выдающая список под-узлов (узлов и листьев).
Теперь же нужно найти способ жрать это дерево так, чтобы способ жратья 1. не подразумевал загрузку всего дерева в память -- представим, например, что дерево -- это файловая система с распакованными исходниками ядра линупса, 2. обладал свойством "конечность времени пожирания конкретного узла", 3. не был тупым скотоморфизмом и позволял бы на разных уровнях дерева в зависимости от разных условий (от пройденных элементов, от глубины) использовать в качестве "аккумулятора" значение разных типов (например, для аналога "du --max-depth=1" -- на верхнем уровне будем собирать list (dir_name * size), на уровнях ниже -- просто суммировать size).
[11:32:39] <Kakadu> ну 1е вроде решается заворачиванием получения потомков в функцию, которая заглядывает в ФС
[11:32:53] <gds> из "идей около" -- только какой-то из еретических оо-паттернов (визитор?  хз, в сортах не разбираюсь), и не менее еретические Data.{Traversable,Foldable}.
[11:33:20] <gds> Kakadu: недопонял мысль, можешь чуть развернуть?
[11:33:23] <Kakadu> ладно, буду лучше молчать
[11:33:42] <gds> зря, свежие идеи полезны.
[11:34:24] shaggie вошёл(а) в комнату
[11:34:24] <f[x]> а как же yield?!
[11:34:35] shaggie вышел(а) из комнаты
[11:34:49] <gds> f[x]: и снова конкретизации хочется.
[11:34:54] <Kakadu> я хотел бы сделать так, что потомки подгружаются в момент сворачивания родителского узла, а родитель собирается мусорщиком нафиг
[11:35:34] <Kakadu> сворачивания==жранья
[11:35:38] <f[x]> gds: а хз, я сам ещё не разбирался :)
[11:35:49] f[x] отвечает в стиле ermine :)
[11:36:31] <Kakadu> надо бы вспомнить как в додиезе завязывать списки в узел с помощью yield
[11:37:51] Typhon вошёл(а) в комнату
[11:39:35] <gds> Kakadu: да, так и надо, по идее.  Но тут ещё дело в том, что нужно обеспечить конечность времени и памяти, поэтому прямой доступ к потомкам давать нельзя, видимо.
[11:40:49] <gds> кстати вот, если начинать с родителя, то свернуть корень можно будет только тогда, когда будут готовы результаты свёртки всех подузлов дерева.  то есть, в памяти/стеке выстроится структура, изоморфная этому дереву.
[11:41:13] <ermine> читать доки три раза в год
[11:43:02] <gds> а с другой стороны, если начинать с листьев, не получится эффективно отсекать поддеревья.
[11:51:27] gds вышел(а) из комнаты: Replaced by new connection
[11:51:28] gds вошёл(а) в комнату
[13:57:24] shaggie вошёл(а) в комнату
[14:51:03] digimmortal вошёл(а) в комнату
[16:23:10] <digimmortal> троллехарроп говорил, что http://ocamlgraph.lri.fr/ кошерный пример использования объектной системы
[16:23:22] <digimmortal> я правда сам оценить не в состоянии
[16:23:32] <f[x]> там функторы
[16:23:34] <digimmortal> может кто из взрослых откомментит?
[16:25:56] <digimmortal> может я путаю и он говорил про это http://www.lri.fr/~filliatr/software.en.html
[16:36:00] komar вышел(а) из комнаты: Replaced by new connection
[16:36:01] komar вошёл(а) в комнату
[16:42:32] <digimmortal> f[x]: ты был прав - он про пример использования функторов говорил
[17:04:18] gds вышел(а) из комнаты: Replaced by new connection
[17:04:19] gds вошёл(а) в комнату
[17:05:31] komar вышел(а) из комнаты
[17:06:58] <gds> всё чаще для "посмотреть название-типы нужной функции" использую "ocamlfind ocamlbrowser -package ...".  Сделать, что ли, скриптик, который все либы загоняет в аргумент для -package?..
[17:07:34] Kakadu вышел(а) из комнаты
[17:07:52] Kakadu вошёл(а) в комнату
[17:07:55] <f[x]> сделай подкомманду к оазису
[17:08:36] <gds> недопонял, какой смысл?  только используемые в проекте пакажжы смотреть?
[17:09:12] <f[x]> угу
[17:09:22] <f[x]> хотя из коробки же ocamlfind ocamlbrowser -all :)
[17:09:24] <f[x]> rtfm :)
[17:10:17] <gds> в рот мне ноги, чего же я это раньше не видел?  О май факин гоат, где были мои глоза?
[17:11:02] bobry- очень хочет oasis shell, чтобы получить toplevel с токашо скомпилированным прокетом
[17:11:13] <gds> $ alias rtfm=ocamlfind ocamlbrowser -all
[17:11:30] <gds> тьфуты,
$ alias rtfm="ocamlfind ocamlbrowser -all"
[17:11:59] <f[x]> bobry-: ну там патч вроде делают для этого, но это и руками несложно
[17:12:26] <gds> сделать специфический .ocamlinit, содержащий #use "topfind" #require "имяпакета"?
[17:12:26] <bobry-> f[x]: руками это #directory ...;; #load ...?
[17:12:27] <f[x]> пишешь все модули проекта в x.mltop и потом ocamlbuild x.top && rlwrap ./x.top -I _build
[17:12:47] <bobry-> hrm hrm, ну вариант да
[17:23:54] ermine только щас отметила для себя, что в камле практически всё взаимно рекурсивно, кроме let без костыля
[17:24:28] <ermine> type .. and, class .. and, etc, но не let ... and
[17:24:58] <gds> module .. and тоже не рекурсивно по умолчанию.
[17:25:18] <ermine> а, точно
[17:32:13] komar вошёл(а) в комнату
[17:38:32] <gds> между прочим, в последнее время часто использую такую прелесть, как rebind.  было
value fck_file ~name ~params = ...;
но внезапно имя файла надо обработать при входе в функцию:
value fck_file ~name ~params =
  let name = do_something_with name in
  <старое тело как оно было>;
и имею гарантии работоспособности без всяких извратов.
Если бы любой let-in был рекурсивным, у меня бы такой фокус не вышел, пришлось бы серьёзнее менять всё.
[17:39:34] <f[x]> боян!
[17:40:11] <gds> боян, ermine, rec, костыли, дэнс, джага-джага
[17:43:48] <f[x]> интересно, а ведь можно наверное синтаксически забабахать assert который в случае срабатывания будет показывать Std.dump'ом значения всех value в scope текущего топлевел определения..
[17:44:13] <f[x]> будет замыкать конечно кучу всего
[17:46:56] komar ребинд юзает с начала времен в каждой десятой строчке кода.
[17:46:58] <ermine> ырланк юзайте уже
[17:47:09] <komar> Знакомый х-лист называет меня еретиком за это.
[17:47:52] <f[x]> komar: дык батхёрт от зависти просто
[17:48:27] <ermine> в х-ле же есть кавайное Show
[17:48:34] <komar> f[x]: а то.
[17:48:55] <f[x]> им-тобедным приходится какие только "многобесточечные" операторы изобретать, лишь бы имена новые не придумывать
[17:49:04] <ermine> а в камле всё только через четыре попы
[17:51:31] <komar> Фитча же!
[18:11:18] <ermine> в х-ле синтаксис правильно расширяется, там расширения не конфликтуют хоть, а в к-ле всё через четыре места и все с конфликтами
[18:12:36] <komar> што
[18:43:35] <gds> напомните, как scanf'ом читать всё до конца строки?  Пробовал "%[\\000-\\255]", но не читает ни одного символа.
[18:51:36] <f[x]> никак
[18:51:47] <f[x]> для текстовых строк можно читить - %s@\x00
[18:52:00] <f[x]> и юзай %! чтобы быть уверенным
[18:52:21] <f[x]> слэши экранировать не надо
[18:53:28] zinid вышел(а) из комнаты
[18:54:01] <gds> f[x]: понял.  То есть, если до \n, то %s@\n будет ок.
[18:55:47] komar вышел(а) из комнаты
[18:56:40] komar вошёл(а) в комнату
[18:58:28] <f[x]> угу
[19:26:08] shaggie вышел(а) из комнаты
[19:32:12] shaggie вошёл(а) в комнату
[20:04:30] bobry- вышел(а) из комнаты
[20:17:30] digimmortal вышел(а) из комнаты
[20:50:48] bobry вошёл(а) в комнату
[21:31:32] Typhon вышел(а) из комнаты
[21:35:47] shaggie вышел(а) из комнаты
[22:21:29] shaggie вошёл(а) в комнату
[23:21:30] ygrek вошёл(а) в комнату
[23:50:05] Typhon вошёл(а) в комнату
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!