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

GMT+4
[00:06:17] bobry первый раз в своей жизни применил coerce, вот что бывает от использования полиморфных вариантов!
[00:07:28] <gds> объекты тоже рекомендую.
[00:14:05] <bobry> gds: мне тут как то ygrek (или f[x] ?) говорил как по пацански пишут парсеры -- сначала мол парсим в ast типы, потом разбираем ast и генерим внутренние типы
[00:14:10] <bobry> ты шо нить к этому можешь добавить?
[00:23:45] <gds> добавлю только то, что всё тут зависит от специфики.  вникать не буду, поэтому по сути добавить ничего не смогу.
[00:24:13] <bobry> ок
[00:33:40] ermine вышел(а) из комнаты
[00:53:00] Typhon вошёл(а) в комнату
[01:39:37] <bobry> ftrvxmtrx: ping
[01:45:13] <bobry> у ле галла наверное монитор на 90 градусов повернут
[01:45:31] <bobry> кода буквалоно 30 символов строчке
[01:46:54] <bobry> и читается хуже gdsовского .. еще размашистей
[01:47:00] <bobry> что за напасть такая у камло программистов
[01:48:26] <gds> у меня 4:3, 80 столбцов, 25 строк.
[01:49:19] <bobry> ну ты все равно размашисто пишешь :)
[01:54:33] <gds> да я уже 10 лет камло..ствую, и уже знаю, где и как сделать с синтаксисом так, чтобы при переписывании n-лет-давнего кода от этого был минимальный гемор.  ну и простые исправления тоже легко даются.  вон, сегодня тупл из 5 элементов отрефакторил за 5 минут из (a,b,c,d,e) в {c, Sumtype a b d e}, быстро, предсказуемо, причём у меня не было type ascriptions почти нигде, но пару десятков функций имелось.  причём не затратил при этом моска почти никак, только для модификации type .. = ..
[01:55:50] bobry тоже хочет 10 лет камло :)
[01:57:17] <gds> итеративный рефакторинг тоже умею, всякие программки, которые почему-то надо изменить, его требуют.  вот и пишу так, чтобы 1. можно было отрефакторить итеративно, 2. рефакторить можно было тупо синтаксически, с выключенным мозгом, смотря только на вывод компилятора.
[01:58:05] <bobry> ну блин, gds, ну ведь все стараются писать шобы можно было рефакторить -- причем не только лично. вот хочу я отрефакторить твой код и у меня ступор
[01:58:12] <bobry> от того как он выглядит :)
[01:58:23] <bobry> тут либо я идиот и немогу распарсить, либо что-то действительно не так
[01:58:49] <bobry> это о shell-dsl и iteratees, которые я тут на выхах почитывал
[01:58:50] <gds> ну, 10 лет -- это от первых хелловорлдов.  годик тупака, годик втыкачки в книги, несколько лет работы (камло в режиме "чисто для себя / хобби").
[01:59:22] <gds> сейчас про свой стиль вкратце расскажу.
[01:59:30] <gds> может окажется полезным кому-то.
[02:04:01] <gds> если есть синтаксическая конструкция из начального и конечного элементов, и элементы разделены каким-то разделителем, часто есть смысл его пихать построчно, в начале строки:
( 1
, "asd"
, True
)
если конструкция представляет собой что-то "вложенное" (let-in, module = .., class ..), то делаем отступ.
ну и недавно вывел про type ascriptions, что вот таким образом определять функции/значения неплохо:
value func
: a -> b -> c
= fun arg_a arg_b ->
     тушка_функции
;
и ещё, для более тупого рефакторинга, у меня открывающие и закрывающие элементы на одном уровне выравнивания.  "value" и ";", например.  ну или в туплах и записях, соответственно, "(" и ")", и "{" и "}".  матчинга тоже касается.
[02:05:18] Kakadu вышел(а) из комнаты
[02:05:30] <gds> "если original syntax и camlp4 дороги вам, держитесь подальше от моего кода" :]
[02:06:31] <gds> вообще, я использую двухуровневый синтаксис, только никому об этом раньше не говорил.
[02:06:56] <ftrvxmtrx> bobry, pong
[02:07:33] <bobry> ftrvxmtrx: да хотел спросить что у тебя не собирается, но уже сам все выяснил :)
[02:07:45] <ftrvxmtrx> а, ну хорошо :)
[02:08:10] <bobry> ле галл красавец
[02:08:14] <gds> а если есть выравнивание открывающих-закрывающих элементов, то можно говнокодить так, чтобы выдавать в продакшон результаты, а "любовно полировать инструмент" исключительно на досуге.
[02:08:27] <bobry> мало того что тесты собирает by default, так еще и сам все сломал, а релиз оазиса не сделал
[02:08:39] <bobry> gds: а почему не ml / mli для сигнатур?
[02:08:44] <bobry> типа "можно забыть"?
[02:12:12] <gds> mli и сигнатуры (module .. : sig .. сигнатура! .. end = struct .. end) использую только в случае, когда интерфейс устоялся и в ближайшее время изменений не будет / не планируется.  К сожалению, пишу не кирпичи бетон сваи фундамент оптом доставка, а более-менее живой код.  Если интерфейс чоткий или если есть вероятность что-то прощёлкать из-за отсутствия сигнатуры больше пяти процентов, то mli/сигнатура там есть.
[02:16:44] <gds> а собственно
value ..
: тип
= значение
-- это для удобства отладки по типам и поддержки актуальных типов-значений.  можно через "value ... (arg_a : a) (arg_b : b) : c = ...", но туда не вставишь " ! 'a . " для проверки компилятором полиморфности, ну и ещё какие-то противные проблемы были.
[02:20:28] <gds> а, забыл про главный фокус.  если есть
value func
: sometype
= ... some body ...
;
, то вырезкой от "=" включительно и до ";" исключительно мы получаем собственно элемент сигнатуры.
и наоборот, имея такую сигнатуру, можно скопипастить её в структуру модуля и дорисовать тушку.
[02:22:06] <gds> ну и вот, эти фокусы делаются чисто по уровню выравнивания.  берём любой текстовый редактор, становимся на открывающий синтаксический элемент, жмём достаточное количество раз кнопку "вниз" и попадаем на закрывающий синтаксический элемент.  меня радует это.
[02:26:29] <bobry> жаль что ле-галл не следует этому простому правилу
[02:26:37] bobry тут парсил его код -- фик поймешь где заканчивается блок
[02:26:59] <bobry> а если учитывать что у блоков еще 100500 строчек длина из за 30 символов в строке, то получается совсем тяжко
[02:28:30] bobry перелопатил уже пол конфига барбары из за этих рецептов ..
[02:29:17] <gds> а это уже последствия original syntax, где закрывающие элементы редки.  Ну и выравнивание надо соблюдать.  Мне не сложно "C-u число C-x t" для того, чтобы поправить выравнивание в большом блоке, либо руками по нескольким строкам пробежаться -- самому же проще писать.
[02:29:43] <bobry> стало быть емакс :)
[02:29:49] <bobry> а то ты тут говорил шо в нотпаде пишешь все
[02:29:55] <bobry> ну или в каком то простом редакторе
[02:30:22] <gds> емакс -- чисто как текстовый редактор!  ну и компиляция-перекомпиляция, и переход на ошибку.  а так -- не больше.
[02:32:48] <gds> сейчас у меня официальная позиция состоит в том, что я выучил 7 сочетаний клавиш для емакса.  а теперь, видимо, надо признать, что я обманываю, и на самом деле выучил штук 10.
[02:35:02] <bobry> :D
[02:40:27] dzhon вышел(а) из комнаты
[02:41:05] <bobry> грр, this pattern matching is fragile
[02:41:15] <bobry> компилятор камла слишком много думает в некоторых местах
[02:41:25] <bobry> пойду я посплю, gds спасибо за стильный рассказ :)
[02:44:32] bobry вышел(а) из комнаты
[02:53:50] <gds> кстати вот, налажал о подробностях, C-u число C-x tab" (т.е. tab вместо t).  надеюсь, вы там не пишете в емаксе код для атомной станции на х-е/питоне, где выравнивание имеет семантику!
[02:58:46] Typhon вышел(а) из комнаты
[04:46:35] komar вышел(а) из комнаты: Replaced by new connection
[04:46:35] komar вошёл(а) в комнату
[05:05:41] komar вышел(а) из комнаты: Replaced by new connection
[05:05:41] komar вошёл(а) в комнату
[05:32:02] komar вышел(а) из комнаты: Replaced by new connection
[05:32:02] komar вошёл(а) в комнату
[07:21:12] Kakadu вошёл(а) в комнату
[07:38:52] Kakadu вышел(а) из комнаты
[07:39:28] komar вышел(а) из комнаты: Replaced by new connection
[07:39:28] komar вошёл(а) в комнату
[07:50:55] bobry вошёл(а) в комнату
[07:52:01] bobry вышел(а) из комнаты
[08:45:31] komar вышел(а) из комнаты: Replaced by new connection
[08:45:31] komar вошёл(а) в комнату
[09:12:50] komar вышел(а) из комнаты: Replaced by new connection
[09:12:50] komar вошёл(а) в комнату
[09:24:50] superbobry вошёл(а) в комнату
[10:16:56] komar вышел(а) из комнаты: Replaced by new connection
[10:16:57] komar вошёл(а) в комнату
[10:31:08] dzhon вошёл(а) в комнату
[10:32:20] dzhon вышел(а) из комнаты
[10:32:45] dzhon вошёл(а) в комнату
[10:48:32] ftrvxmtrx вышел(а) из комнаты
[10:51:26] ftrvxmtrx вошёл(а) в комнату
[11:15:34] dzhon вышел(а) из комнаты: Replaced by new connection
[11:15:39] dzhon вошёл(а) в комнату
[11:25:22] ftrvxmtrx вышел(а) из комнаты
[11:47:19] ermine вошёл(а) в комнату
[11:52:56] komar вышел(а) из комнаты
[12:30:28] Kakadu вошёл(а) в комнату
[12:34:32] ftrvxmtrx вошёл(а) в комнату
[12:48:38] shaggie вошёл(а) в комнату
[12:50:37] dzhon вышел(а) из комнаты: Replaced by new connection
[12:50:38] dzhon вошёл(а) в комнату
[12:59:10] <Kakadu> фух, мутабельный код типа
let counter =
  let ref x = 0 in
  fun () -> x:= 1+ !x; !x
;;
[12:59:30] <Kakadu> выглядит не так уж страшно на х-е. Всего лишь
counter = (=~ (+ 1)) <$> new 0
[13:01:42] <ftrvxmtrx> читабельненько так
[13:01:50] Kakadu принял оборонительную стойку на всякий случай
[13:13:53] rren вышел(а) из комнаты
[13:24:03] <klapaucius> Мне понравилось. Но тут ничего неожиданного нет.
[13:24:35] <superbobry> Kakadu, а откуда =~?
[13:24:57] <Kakadu> https://www.linux.org.ru/forum/development/7408577
[13:25:01] <Kakadu> ничего не знаю
[13:25:42] f[x] promptly reminds что для х-фагов есть отдельная резервация
[13:27:51] <klapaucius> К сожалению, так обычно ха хаскеле не пишут. Там почему-то любят крайне многословно названные функции для работы с рефами (разных видов которых в хаскеле много) типа pleaseModifyMyBlahBlahBlahRef
[13:29:15] <ftrvxmtrx> plzChangeRefOKThnxBai
[13:32:20] <superbobry> на х-ле и так хватает закорючек, если бы они на каждый тип рефа еще пачку бы плодили -- то х-ль превратился бы в перл
[13:33:20] <klapaucius> А на каждый и не надо. Можно со всеми рефами одними закорючками работать. При этом большая часть закорючек вообще будет для всех монад/функторов
[13:33:43] <superbobry> хотя можно и так ага
[13:38:01] Typhon вошёл(а) в комнату
[13:38:09] Typhon вышел(а) из комнаты
[13:40:48] Typhon вошёл(а) в комнату
[13:42:46] komar вошёл(а) в комнату
[14:19:09] komar вышел(а) из комнаты: Replaced by new connection
[14:19:10] komar вошёл(а) в комнату
[14:26:09] dzhon вышел(а) из комнаты
[14:57:14] komar вышел(а) из комнаты: Replaced by new connection
[14:57:16] komar вошёл(а) в комнату
[16:58:35] dzhon вошёл(а) в комнату
[17:08:44] <superbobry> товарищи, а что за Obj.repr такой?
[17:09:38] <f[x]> obj is not part of ocaml language
[17:10:15] <superbobry> что-что?
[17:13:09] letrec вошёл(а) в комнату
[17:18:46] <ftrvxmtrx> Obj considered harmful
[17:20:43] <superbobry> ну, это не мешает ocamlyacc его использовать
[17:20:52] <superbobry> просто хотелось узнать что это за функция
[17:21:19] <gds> по типам obj.mli всё понятно.
[17:21:54] <gds> или поищи книжку "Learn Obj in 21 days".
[17:22:15] <f[x]> and spoil any codebase in 5 minutes
[17:22:56] <gds> learn you an Obj for great evil!
[17:23:06] <f[x]> s/an/some/
[17:23:23] <f[x]> Some Obj!
[17:23:57] <gds> тогда уже Some (module Obj : T)
[17:24:11] <f[x]> Some (module Obj : Evil)
[17:24:18] <gds> Так!
[17:26:38] <superbobry> эх ладно, дома посмотрю -- на работе нет репки камло
[17:27:39] <gds> site:caml.inria.fr inurl:manual obj
[17:28:14] <superbobry> http://caml.inria.fr/pub/docs/manual-ocaml/libref/Obj.html
[17:28:21] <superbobry> "по типам Obj"?
[17:28:50] <f[x]> "Warning - visiting this part of manual may harm your computer!"
[17:29:21] <gds> ну да, по типам вполне.
[17:33:23] superbobry вышел(а) из комнаты
[17:48:14] dzhon вышел(а) из комнаты
[17:53:14] <Kakadu> > Кроме того, вроде бы как в рамках System F можно проэмулировать некоторые вещи из ООП наследования, через механизм эквивалентности типов.
Это те sym и refl которые gds выписывал?
[17:53:32] <gds> нет.
[17:53:47] <gds> почитай про system f, там интересно.
[17:55:18] <Kakadu> http://newstar.rinet.ru/~goga/tapl/tapl029.html "Универсальные типы". Это например?
[17:59:53] <gds> Kakadu: да, там про system f есть.  но сама system f -- не айс.  я бы не хотел её по дефолту в окамле, например.
[18:00:11] <gds> но знать про неё -- чуть ли не обязательно для каждого функциональщика.
[19:12:33] Kakadu вышел(а) из комнаты
[19:53:30] Kakadu вошёл(а) в комнату
[20:23:20] ftrvxmtrx вышел(а) из комнаты
[21:02:35] shaggie вышел(а) из комнаты
[21:08:12] letrec вышел(а) из комнаты
[21:37:38] dzhon вошёл(а) в комнату
[21:44:53] dzhon вышел(а) из комнаты
[21:45:05] dzhon вошёл(а) в комнату
[21:57:36] bobry вошёл(а) в комнату
[22:31:30] f[x] вошёл(а) в комнату
[22:55:21] <bobry> а расскажите мне почему fragile matches это плохо?
[22:56:12] <bobry> вот есть у меня тип foo = Foo | Bar of string | Baz -- почему опасно делать
match smth with
  | Foo -> true
  | _    -> false
[23:10:05] <gds> а там же в предупреждении написано, почему.
[23:11:16] ermine вышел(а) из комнаты
[23:14:03] Typhon вышел(а) из комнаты
[23:14:29] Typhon вошёл(а) в комнату
[23:51:02] Kakadu вышел(а) из комнаты
[23:53:12] Kakadu вошёл(а) в комнату
[23:54:19] <bobry> D: Resolving recipe "textile"
D: Recipe "textile" is found in repository "default"
[23:54:24] <bobry> :)
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!