[00:49:50] <vаlexey> vlad2: ыыы!!!
[00:49:53] <vаlexey> line 4: type mismatch: expected 'multi-character string', got 'multi-character string'


[00:50:04] <vаlexey>    JS.alert("Hello, World!"="aa")
[00:50:05] <vlad2> :)
[00:50:39] <vаlexey> коварный Вирт нифига не написал что означает =, <=, >= для char array'ев :-)
[00:50:47] <vlad2> Ага.
[00:51:06] <vlad2> Не говоря уже про нолики в этих массивах
[00:51:18] <vаlexey> "The ordering relations <, <=, >, >= apply to the numeric types, CHAR, and
character arrays."
[00:51:34] <vаlexey> Вот как хочешь, так и фантазируй :-D
[00:51:54] <vаlexey> но там наверно какая-нибудь транзитивность то должна выполняться
[00:55:59] <vаlexey> СТОП
[00:56:16] <vаlexey> у Вирта не сказано, что для relations операнды должны быть одного и того же типа
[00:56:18] <vаlexey> оба операнда.
[00:56:29] <vаlexey> значит ли это, что число можно сравнивать со строкой?
[00:56:50] <boris_ilov> Тык null символ он и в юникодах null символ
[00:56:56] <boris_ilov> или я чего не понял?
[00:57:38] <vаlexey> я имею ввиду можно ли такое: 42 = "привет Борис"
[00:57:50] <vаlexey> а если нет - ткните меня носом в репорт, где про это написано!
[01:02:53] <boris_ilov> фак!
[01:03:08] <boris_ilov> динамическая типизация -_-
[01:03:36] <boris_ilov> и неявное преобразование типов
[01:03:38] <boris_ilov> :D
[01:03:43] <vаlexey> ну, почему динамическая? статическая! обычная функция двух аргументов РАЗНОГО типа :-)
[01:03:46] <vаlexey> на выходе BOOL
[01:04:03] <vаlexey> а неявное преобразование и прочее - это один из вариантов реализации :-)
[01:04:24] <vаlexey> например никто не мешает всегда возвращать на попытки сравнить число и строку FALSE
[01:09:50] <boris_ilov> А я грешен
[01:10:03] <boris_ilov> Я числа в строки так преобразую
[01:10:13] <boris_ilov> Т = "" + 447
[01:10:15] <boris_ilov> :D
[01:10:48] <vаlexey> o_O
[01:10:53] <vаlexey> плахо-ой кодер!
[01:10:54] <boris_ilov> Ибо лень писать Т = Строка(447)
[01:10:58] <vаlexey> нигодный!
[01:11:04] <boris_ilov> каюсь
[01:11:10] <vаlexey> грязный кодинг!
[01:11:26] <boris_ilov> хватит! я уже покраснел
[01:20:41] <vlad2> Жабаскрипт детектед!
[01:21:45] <vаlexey> это ты про relations в обероне? :-)
[01:22:21] <vаlexey> зато такое поведение для relations отлично на js ложится!
[01:41:03] <vlad2> Не, это я про "" + херня = "херня"
[01:41:20] <vlad2> Жабаскриптовый паттерн
[01:42:05] <vlad2> Кстати, а ты свежак брал? Я там как раз фиксил что-то в сравнениях строк.
[01:42:12] <vlad2> С неделю назад.
[01:42:38] <vаlexey> не
[01:42:40] <vаlexey> ща возьму
[01:44:18] <vlad2> https://github.com/vladfolts/oberonjs/commit/0ed6ae841be1252f777760b6c01c5b91c4c3b0bd
[01:44:50] <vаlexey> while resolving "parser"...
while resolving "context"...
while resolving "oc"...
Traceback (most recent call last):
 File "build.py", line 94, in <module>
   build(sys.argv[1], use_git)
 File "build.py", line 77, in build
   link('oc.js', os.path.join(out, 'oc.js'), ['src', 'src/oberon.js'], version)
 File "/home/oberjs/oberonjs/browser/linkjs.py", line 64, in link
   out.write(prolog)
 File "/home/oberjs/oberonjs/browser/linkjs.py", line 44, in process
   raise sys.exc_info()[1]
Exception: cannot find "oberon.js/lexer.js" in "['src']"

[01:44:51] <vlad2> И тестик там: ASSERT("abc" = "abc");
[01:44:56] <vаlexey> при попытке обновления
[01:45:28] <vlad2> Странно. Файлик-то на месте?
[01:45:48] <vаlexey> который?
[01:45:58] <vlad2> oberon.js/lexer.js
[01:46:35] <vlad2> В репе присутствует.
[01:46:48] <vаlexey> угу
[01:46:58] <vаlexey> src/oberon.js/lexer.js
[01:47:16] <vlad2> И в build.py присутсвует.
[01:47:23] <vlad2> link('oc.js', os.path.join(out, 'oc.js'), ['src', 'src/oberon.js'], version)
[01:47:34] <vlad2> Т.е. должен все находить.
[01:47:56] <vlad2> build.py видимо не обновился.
[01:48:32] <vlad2> Запусти еще раз - должно помочь (если build.py обновился после первого запуска)
[01:48:41] <vаlexey> http://oberspace.dyndns.org/tree
[01:48:48] <vаlexey> вот что у меня в каталоге твориццо
[01:49:06] <vаlexey> неа, не помогает
[01:49:12] <vlad2> Проверь, что у тебя build.py свежий
[01:49:55] <vаlexey> каг?
[01:50:30] <vlad2> git pull ручками?
[01:50:51] <vаlexey> up-to-date
[01:51:16] <vlad2> См. строчку: https://github.com/vladfolts/oberonjs/blob/163417886e1460343bb64e1baea27b136565587b/build.py#L77
[01:53:20] <vаlexey> да, та же самя строчка
[01:54:04] <vlad2> Тогда почему он в ошибке пишет "['src']"?
[01:54:24] <vlad2> Должно быть ['src', 'src/oberon.js']
[01:55:25] <vаlexey> while resolving "parser"...
while resolving "context"...
while resolving "oc"...
Traceback (most recent call last):
 File "build.py", line 94, in <module>
   build(sys.argv[1], use_git)
 File "build.py", line 77, in build
   link('oc.js', os.path.join(out, 'oc.js'), ['src', 'src/oberon.js'], version)
 File "/home/oberjs/oberonjs/browser/linkjs.py", line 65, in link
   process(input_path, out, [], [], dirs)
 File "/home/oberjs/oberonjs/browser/linkjs.py", line 44, in process
   raise sys.exc_info()[1]
Exception: cannot find "oberon.js/lexer.js" in "['src', 'src/oberon.js']"

[01:55:33] <vаlexey> все правильно он пишет :-)
[01:55:49] <vаlexey>  File "build.py", line 77, in build
   link('oc.js', os.path.join(out, 'oc.js'), ['src', 'src/oberon.js'], version)
[02:02:10] <vlad2> Э. Тогда хз :)
[02:02:28] <vlad2> Надо смотреть чего он еге не находит.
[02:02:32] <vlad2> Все пути вроде правильные.
[02:02:35] <vаlexey> это что же, мне теперь в питонов код смотреть шоле?
[02:05:53] <vаlexey> всё. нашел
[02:05:56] <vаlexey> винда маздай!
[02:06:38] <vаlexey> у тебя там лежал файл не lexer.js, а Lexer.js
[02:08:52] <vаlexey> так что все собралось
[02:09:53] <vаlexey> да, теперь строки пытаются сравниваться :-)
[02:10:02] <vlad2> Хе-хе ;) Я так и знал, что из-за дурацкого юникса ;)
[02:10:11] <vlad2> Круто :)
[02:11:03] <vаlexey> а с числом сравниваццо нехотит!!11
[02:11:05] <vаlexey> :-D
[02:11:15] <vаlexey> А чем генерируемый код страшен?
[02:13:25] <vlad2> Ну посмотри там что будет для s = "abc"
[02:14:03] <vаlexey> а что такое s? переменная-массив?
[02:15:35] <vаlexey> RTL$.strCmp(RTL$.strToArray("Hello, World!"), s)
[02:15:40] <vаlexey> ну а чо? жить вроде можно :-)
[02:27:41] <vаlexey> кстати, на маке тоже бы все работало как надо
[02:28:30] <vlad2> Не. Оно должно генерить что-то типа RTL$.strCmpLiteral("Hello", s);
[02:28:44] <vlad2> strToArray там совершенно лишнее
[02:30:49] <vlad2> Ты это, может страничку заодно обнови?
[02:31:17] <vlad2> А.
[02:31:24] <vlad2> Оно оптяь в кэше застряло.
[02:38:02] <vаlexey> да не, не застряло. так и генерит :-)
[02:38:04] <vаlexey> как я кинул
[02:40:41] <vlad2> Не, у меня оно показывало версию октябрьскую, пока F5 не нажал
[02:58:20] <vlad2> Обожаю многопоточку. Разминка круче ЦД.
[03:06:58] <vаlexey> о, да
[03:18:16] <vlad2> И тесты рулят как никогда.
[13:57:26] <vаlexey> http://lenta.ru/news/2013/11/08/tank/
[14:34:21] <vаlexey> vlad2: читал Programming in Oberon?
[14:34:27] <vаlexey> я там тему создал
[16:03:17] <vаlexey> дас. Оберон надо таки доопределять. А то там слишком много неоднозначностей (и рассчета, на так называемый, здравый смысл читающего, ага)
[18:40:27] <vаlexey> http://www.youtube.com/watch?feature=player_embedded&v=-QRB0zPWf7Y
[18:57:17] <vlad2> Че-то многа букаф...
[18:58:05] <vаlexey> где?
[18:58:11] <vlad2> Ето чего такое? Тема из аниме? :)
[18:58:23] <vlad2> В "Programming in Oberon"
[18:59:12] <vlad2> Вечерком гляну подробнее.
[18:59:31] <vаlexey> vlad2: ну, на самом деле да. Но исполнитель другой
[18:59:42] <vаlexey> вот эта анима: http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B4%D1%8C%D0%BC%D0%B8%D0%BD%D0%B0_%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8
[18:59:52] <vаlexey> Исполнитель другой, и исполняет лучше и естественней чем в самом аниме.
[19:00:00] <vlad2> А. Я смотрел :)
[19:00:06] <vаlexey> 魔女の宅急便
[19:00:14] <vlad2> Но не проникся.
[19:00:38] <vаlexey> но песенка хорашая. безотносительно аниме
[19:00:46] <vаlexey> вот конкретно это исполнение и этот видеоряд
[19:01:10] <vlad2> Ага.
[19:50:46] <vlad2> Давайте делиться прикольными анимешными песенками. Мне вот эта запомнилась: https://www.youtube.com/watch?v=91mD3DV8xS0
[20:26:29] <boris_ilov> Сейчас в тренде http://www.youtube.com/watch?v=eOofWzI3flA
[21:08:58] <boris_ilov> PROCEDURE CloseWindow (w: Windows.Window);
VAR res: INTEGER; msg: Sequencers.CloseMsg;
BEGIN
IF w # NIL THEN
IF ~w.sub THEN
msg.sticky := FALSE; w.seq.Notify(msg);
IF ~msg.sticky THEN
IF w.seq.Dirty() & ~(Windows.neverDirty IN w.flags) THEN
HostDialog.CloseDialog(w, quit, res);
IF res = HostDialog.save THEN
SaveWindow(w, FALSE); (* if saving is canceled, document remains dirty *)
IF w.seq.Dirty() THEN quit := FALSE
ELSE Windows.dir.Close(w)
END
ELSIF res = HostDialog.cancel THEN quit := FALSE
ELSE Windows.dir.Close(w)
END
ELSE Windows.dir.Close(w)
END
ELSE quit := FALSE
END
ELSE Windows.dir.Close(w)
END;
IF ~quit THEN Kernel.Cleanup END
END
END CloseWindow;
[21:09:17] <boris_ilov> IIIIIIIIIIIIIIIIIIIF...EEEEEEEEEEEEEEEEEEEND!!!
[21:10:13] <vlad2> Да, это оно. Структурное программирование по Дейкстре :)
[21:11:12] <vlad2> Такое структуроное и безпощадное.
[21:14:07] <boris_ilov> руки чешутся код хоста в порядок привести
[21:14:11] <boris_ilov> выровнять
[21:14:20] <boris_ilov> голые числа уборать
[21:14:23] <boris_ilov> убрать
[21:14:41] <boris_ilov> Сложно бороться с рвотными позывами....
[21:15:09] <boris_ilov> Я вообще в этом отношении перфекционист
[21:16:00] <boris_ilov> http://anticache.img6.joyreactor.cc/pics/post/%D0%B0%D0%B4-%D0%BF%D0%B5%D1%80%D1%84%D0%B5%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%81%D1%82%D0%B0-%D0%BF%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0-546826.jpeg
[21:16:32] <boris_ilov> http://2.bp.blogspot.com/-ulcDDEgWBOA/Ta_n-nU6doI/AAAAAAAABRI/IYNn_Z3Tbso/s400/018_fry-argh.gif
[21:21:26] <vаlexey> boris_ilov: это где такое?
[21:21:30] <vаlexey> модуль какой?
[21:22:32] <boris_ilov> все там же
[21:22:36] <boris_ilov> HostWindows
[21:24:18] <boris_ilov> тьху
[21:24:24] <boris_ilov> вру HostCmds
[21:28:27] <vаlexey> да-а...
[21:29:11] <vаlexey> так. вот думаю я, что читабельность новых исходников можно повысить просто закрепив в кодингстайлей размер отступа не 2 пробела, а 4
[21:29:22] <vаlexey> раза в два читабельность повысится :-D
[21:29:51] <boris_ilov> Я всегда на 4 символах в 1С
[21:30:07] <boris_ilov> после этого в ББ глаза из орбит вылазят
[21:30:08] <vаlexey> я про Оберон
[21:30:12] <boris_ilov> я понял
[21:30:24] <vаlexey> Ибо там по умолчанию (если выкинуть ББ с его табами вместо пробелов) - 2 пробела
[21:30:57] <vаlexey> А вот если сделать 4 пробела, то уровень вложенности IF'ов понизится, а декомпозиция и организация кода наоборот - улучшится :-P
[21:31:28] <vlad2> А я вот хочу множественный RETURN.
[21:31:37] <vlad2> И еще тернарный оператор.
[21:32:04] <vаlexey> vlad2: да вы, батенька, не из содомитов будете? :-)
[21:32:19] <vаlexey> это ж грехопадение как есть!
[21:32:38] <vlad2> Не, серьезно, с вложенными ифами надо что-то делать. Это пипец какой-то.
[21:32:39] <boris_ilov> свят свят
[21:32:54] <vlad2> Если не множественным ретурном, то еще как.
[21:33:16] <vаlexey> vlad2: предлагаешь провести кровавый ритуал и призвать GOTO из небытия? :-D
[21:33:24] <vlad2> У меня такой херни в коде в принципе нет - 2, ну максимум 3 вложенных ифа.
[21:33:44] <vаlexey> не, в сях я такое периодически вижу
[21:33:48] <vаlexey> правда не в своем коде
[21:33:56] <vаlexey> вот в сестрином видел разок
[21:34:01] <vlad2> Не надо goto. Надо множественный ретурн + какой-то механический клеанап.
[21:34:11] <vаlexey> там есть одно место у них в сервере... туда стараются не заглядывать без сильной нужды :-)
[21:34:29] <boris_ilov> Любопытно
[21:34:32] <vlad2> Вот-вот.
[21:34:39] <boris_ilov> А как сие более читабеьно переписать?
[21:34:58] <boris_ilov> в рамках...
[21:35:08] <vlad2> В этом же примере видно, что "Windows.dir.Close(w)" должен быть в одном месте где-то.
[21:35:13] <vlad2> А не рассован по концам веток.
[21:35:48] <vаlexey> уровень вложенности = 6
[21:35:59] <vаlexey> это фигня, я видел 12!
[21:36:07] <vаlexey> по моему в сишном индусском коде :-)
[21:36:30] <vаlexey> (причем это было в 1000 строчной функции)
[21:37:09] <vlad2> IF w # NIL THEN RETURN - уже не 6, а 5
[21:37:37] <boris_ilov> Через вспомогательную переменную можно
[21:37:52] <boris_ilov> ифы друг за другом
[21:38:18] <boris_ilov> В переменной статус из предыдущего ифа
[21:38:38] <vаlexey> ну, блин. предложите на форуме народу как задачку - переписать.
[21:39:35] <vаlexey> можно ваще через конечный автомат :-D
[21:40:50] <boris_ilov> http://oberspace.dyndns.org/index.php/topic,577.msg19499.html#msg19499
[21:42:59] <vаlexey> да, с табом в 4 пробела это смотрится настолько угребищно, что автор бы наверняка задумался прежде чем писать ТАКОЕ
[21:45:07] <vlad2> А вот это как понимать:
msg.sticky := FALSE; w.seq.Notify(msg);
IF ~msg.sticky THEN
[21:45:15] <vlad2> Просто хотелось еще один иф? :)
[21:45:25] <vlad2> Так. Уже 4 ифа :)
[21:45:55] <vаlexey> vlad2: там же VAR-передача
[21:46:06] <vаlexey> то есть приемник сообщения этот флаг может поменять
[21:46:25] <vаlexey> та самая шина сообщений же!
[21:46:36] <vаlexey> мутабельных
[21:46:37] <vаlexey> :-D
[21:50:25] <vаlexey> во народ на Украине развлекается! http://lenta.ru/news/2013/11/08/klichko/
[21:51:03] <boris_ilov> PROCEDURE CloseWindow (w: Windows.Window);
VAR res: INTEGER; msg: Sequencers.CloseMsg;
status: BOOLEAN;
BEGIN

   status := w # NIL;
   status := status & ~w.sub;

   IF status THEN
   msg.sticky := FALSE; w.seq.Notify(msg);
ELSE
Windows.dir.Close(w);
END;

status := status & ~msg.sticky;

IF ~status THEN
quit := FALSE
   END

   status := status & w.seq.Dirty() & ~(Windows.neverDirty IN w.flags);
   
   IF status THEN
       HostDialog.CloseDialog(w, quit, res);
       IF res = HostDialog.save THEN
           SaveWindow(w, FALSE);    (* if saving is canceled, document remains dirty *)
           IF w.seq.Dirty() THEN quit := FALSE
           ELSE Windows.dir.Close(w)
           END
       ELSIF res = HostDialog.cancel THEN quit := FALSE
       ELSE Windows.dir.Close(w)
       END
   ELSE Windows.dir.Close(w)
   END

IF ~quit THEN Kernel.Cleanup END
END CloseWindow;
[21:51:40] <boris_ilov> Чет все сломалось....
[21:51:47] <boris_ilov> табы гребаные
[21:51:56] <boris_ilov> PROCEDURE CloseWindow (w: Windows.Window);
VAR res: INTEGER; msg: Sequencers.CloseMsg;
   status: BOOLEAN;
BEGIN
   
   status := w # NIL;
   status := status & ~w.sub;

   IF status THEN
       msg.sticky := FALSE; w.seq.Notify(msg);
   ELSE
       Windows.dir.Close(w);
   END;

   status := status & ~msg.sticky;

   IF ~status THEN
       quit := FALSE
   END

   status := status & w.seq.Dirty() & ~(Windows.neverDirty IN w.flags);
   
   IF status THEN
       HostDialog.CloseDialog(w, quit, res);
       IF res = HostDialog.save THEN
           SaveWindow(w, FALSE);    (* if saving is canceled, document remains dirty *)
           IF w.seq.Dirty() THEN quit := FALSE
           ELSE Windows.dir.Close(w)
           END
       ELSIF res = HostDialog.cancel THEN quit := FALSE
       ELSE Windows.dir.Close(w)
       END
   ELSE Windows.dir.Close(w)
   END

   IF ~quit THEN Kernel.Cleanup END
END CloseWindow;
[21:52:42] <boris_ilov> Типа того короче
[21:53:02] <boris_ilov> вероятно я где то ошибся
[21:53:10] <boris_ilov> но принцип думаю понятен
[22:12:11] <vlad2> Oh my!!! Что может быть хуже вложенный ифов? Правильно - процедуры, меняющие свои аргументы VAR.
[22:13:33] <vаlexey> vlad2: ну, в ББ ты можешь в изобилии найти и то и другое :-)
[22:14:02] <vlad2> Да, Украина жжет.
[22:22:23] <vlad2> Все это крайне низкоуровнево и нечитаемо.
[22:23:55] <boris_ilov> все песец
[22:24:05] <boris_ilov> смотрю на Title* = ARRAY 64 OF CHAR;
[22:24:19] <boris_ilov> и думаю "Ага. Указатель на массив"...
[22:24:21] <boris_ilov> :D
[22:24:52] <boris_ilov> лгребаные звездочки
[22:25:20] <vаlexey> Да ладно! Читаемость же! Звоздочка намного лучше чем слово скажем public
[22:25:52] <boris_ilov> причем я уже давно в сях не ковырялся
[22:26:23] <vаlexey> уже на подкорке
[22:26:24] <vаlexey> :-)
[22:26:37] <vаlexey> А что, Title длиннее 64 символов нельзя?
[22:26:42] <boris_ilov> неа
[22:27:03] <vlad2> Суровый оберон. 64 - хватит всем :)
[22:27:30] <vlad2> Вот яне понимаю я такого подхода.
[22:27:36] <vlad2> Уже лет 5 как не понимаю.
[22:27:40] <boris_ilov> ЭтойМойПрекрасныйМодульКоторыйЯВЭкстазеНаписалИВсемПоказываюЕгоОнВедьВосхитителен
[22:27:41] <vlad2> До этого было ОК.
[22:28:20] <boris_ilov> такие названия низя
[22:28:20] <vlad2> Даже не знаю в какой момент произошла смена восприятия.
[22:28:23] <vаlexey> boris_ilov: а Title это разве не заголовок окна?
[22:28:30] <boris_ilov> он
[22:28:30] <vlad2> Я даже язык не менял - С++ и С++.
[22:28:44] <boris_ilov> ну так чего там кроме модулей то?
[22:28:46] <boris_ilov> :)
[22:29:03] <vаlexey> boris_ilov: Ну, блин. Это ж ОКОШКО. Оно может не только ведь модуль содержать
[22:29:06] <vаlexey> Но и любой документ
[22:29:09] <vаlexey> Или форму
[22:29:19] <boris_ilov> ну да
[22:29:26] <vаlexey> В заголовках иногда вообще бегущую строку делают.
[22:29:32] <vаlexey> В качестве нотификации.
[22:36:49] <vаlexey> vlad2: советую таки перечитать: http://www.interstron.ru/upload/images/pubs/Redkaya_professiya.pdf
[22:39:46] <boris_ilov> Вот не понимаю я
[22:39:57] <boris_ilov> при знакомстве с WinApi
[22:40:16] <boris_ilov> первая мысль обернуть это говно нормальным интерфейсом
[22:40:26] <boris_ilov> но разрабы ББ этого не сделали....
[22:40:35] <boris_ilov> лень?
[22:40:47] <vаlexey> нехватка времени и ресурсов видимо
[22:40:51] <vlad2> Бесполезняк его оборачивать.
[22:40:54] <vаlexey> это ж по сути стартап
[22:41:09] <vаlexey> но вообще да. все это не обернешь
[22:41:21] <vаlexey> алсо сам Hosts это ж уже обертка нужного функционала
[22:41:22] <vlad2> Если бы я сейчас клепал чего-то на чистом ЯПИ - я бы почти ничего не обораичивал за рамками RAII.
[22:41:33] <boris_ilov> "Бесполезняк его оборачивать." Ну хоть как то. Хоть часть
[22:42:05] <vlad2> Плюс какие-то хелперы для функций с особо большим количеством параметров.
[22:42:11] <vаlexey> угу
[22:42:18] <boris_ilov> Ну это ж невозможная какашка https://github.com/ilovb/ilovbox/blob/master/Host/Mod/Windows.cps#L1890
[22:42:34] <vаlexey> ну, как обычно - берем здоровенный API и делаем обретку для нужных нам абстракций на базе этого API. Но не более того.
[22:42:47] <vlad2> Ну и базовое что-нибудь - типа подписаться на нужное сообщение в окне. Но вот заводить для этого TWindow и т.п. я бы не стал.
[22:42:47] <vаlexey> Весь API оборачивать смысла не имеет. Пупок развяжется
[22:42:48] <boris_ilov> Тык да
[22:43:05] <boris_ilov> Они ж малую часть этого апи используют
[22:43:39] <boris_ilov> как минимум класс окна можно было сделать
[22:43:55] <vlad2> Ну в ББ это усугубляется тем, что нельзя напряямую сишные хедеы (и константы_ использовать.
[22:43:57] <boris_ilov> и скрыть в нем всю эту монстроинициализацию
[22:44:00] <vаlexey> ты учти что обертка (то есть толстая) она обязательно плодит ошибки
[22:45:23] <boris_ilov> прикол в том что с winapi засрать память как два пальца
[22:45:41] <boris_ilov> тут еще фиг знает где больше вероятность ошибиться
[22:45:50] <boris_ilov> один раз обертку написав
[22:45:52] <vlad2> Собственно я сейчас имею похожую ситуапция на маке. Куча нового необернутого АПИ. Сидеть оборачивать это одному человеку - нереально. Поэтому минимальный вариант - RAII + какие-то хелпера выставляющие все это в примитивы С++ (строки и и.п.)
[22:46:01] <boris_ilov> или в каждом месте использования апи
[22:46:05] <boris_ilov> напрямую...
[22:46:23] <vаlexey> boris_ilov: ты учти что по WinAPI есть дока. очень приличная
[22:46:34] <vаlexey> а по твоей обертке доки не будет.
[22:46:39] <vаlexey> и народ будет плеваться
[22:46:41] <vаlexey> сильно
[22:46:42] <vlad2> Угу.
[22:46:43] <vаlexey> мощно
[22:46:45] <vаlexey> обильно
[22:46:52] <vlad2> Это тоже очень важный момент.
[22:47:06] <vlad2> В случае тонкой обертки - все можно найти в MSDN.
[22:47:16] <vlad2> И без всяких неожиданностей.
[22:47:22] <vаlexey> причем обертка сразу взрослой не выйдет, она будет меняться и перестраиваться. И у тех кто её пользует будет перманентный эффект неожиданности.
[22:48:00] <vаlexey> Алсо спеца знающего WinAPI и умеющего с ним бороться найти можно достаточно легко. А вот специалиста по борьбе с WinAPI и Оберткой вокруг него - фиг найдешь :-)
[22:48:24] <boris_ilov> с++никам везет
[22:48:33] <vаlexey> чо это?
[22:48:35] <boris_ilov> у них хоть макросы есть
[22:48:56] <vаlexey> у нас и шаблоны есть, и raii и много чаво еще!
[22:48:59] <vаlexey> а что? :-)
[22:48:59] <vlad2> У них есть нативный SDK :)
[22:49:03] <boris_ilov> на msdn в основном справка по маркосам как раз
[22:49:13] <vаlexey> vlad2: и богомерзкий отладчик!
[22:49:15] <boris_ilov> а не по функциям winapi
[22:49:25] <vаlexey> да?  по моему как раз по функциям.
[22:49:30] <boris_ilov> неа
[22:49:33] <vаlexey> макросов там вроде не особо много
[22:49:41] <boris_ilov> http://msdn.microsoft.com/en-us/library/windows/desktop/bb773596(v=vs.85).aspx
[22:49:49] <boris_ilov> TreeView_GetItem macro.
[22:50:13] <vаlexey> а, ну макросы они же просты - исходники же их есть!
[22:50:13] <boris_ilov> http://msdn.microsoft.com/en-us/library/windows/desktop/bb773841(v=vs.85).aspx
[22:50:26] <boris_ilov> ога у с++ников есть
[22:50:28] <boris_ilov> :)
[22:50:46] <vаlexey> You can use this macro or send the TVM_GETITEM message explicitly.
[22:50:50] <boris_ilov> а у меня есть WinApi.SendMessageW
[22:50:50] <vаlexey> и всё.
[22:51:08] <vаlexey> Исходники у тебя тоже есть - открываешь хедер и смотришь
[22:51:13] <vаlexey> И пишешь на КП
[22:51:15] <vаlexey> если хочешь
[22:51:19] <boris_ilov> Хедер чего?
[22:51:25] <boris_ilov> У меня есть только WinApi.SendMessageW
[22:51:32] <boris_ilov> а справка по макросам!
[22:51:53] <boris_ilov> примеры использования приходится по всему инету искать
[22:51:55] <vаlexey> Хедер от WinAPI :-)
[22:52:05] <vаlexey> Скачай да поставь. Доступно всем. Бесплатно. Без СМС
[22:52:05] <boris_ilov> макросов там нет
[22:52:09] <vаlexey> есть конечно
[22:52:14] <vаlexey> иначе они бы не работали в плюсах
[22:52:20] <boris_ilov> в CP хидере?
[22:52:23] <boris_ilov> ааа
[22:52:33] <boris_ilov> тык вот гемор короче
[22:53:02] <vаlexey> Не знай. Я макросы не люблю. Я бы руками сообщение отправил, а интереса ради в макрос глянул чо они там наворотили :-)
[22:53:25] <vаlexey> Commctrl.h
[22:53:26] <vаlexey> вот тут оно
[22:53:40] <boris_ilov> примеры задалбывает искать с WinApi.SendMessageW
[22:54:16] <vаlexey> да смотри пример с макросом. смотри в макрос. и повторяй
[22:54:19] <vаlexey> делов то
[22:54:30] <boris_ilov> лень
[22:54:44] <boris_ilov> хочу обертку
[22:54:49] <boris_ilov> :D
[22:54:57] <vаlexey> ну, напиши :-)
[22:55:02] <boris_ilov> лень
[22:55:50] <boris_ilov> надо идею подать
[22:55:56] <boris_ilov> может кто напишет
[22:55:59] <vаlexey> #define TVM_GETITEMRECT         (TV_FIRST + 4)
#define TreeView_GetItemRect(hwnd, hitem, prc, code) \
   (*(HTREEITEM *)(prc) = (hitem), (BOOL)SNDMSG((hwnd), TVM_GETITEMRECT, (WPARAM)(code), (LPARAM)(RECT *)(prc)))
[22:56:02] <boris_ilov> :)
[22:56:18] <vаlexey> О, не то
[22:56:31] <vаlexey> #define TreeView_GetItem(hwnd, pitem) \
   (BOOL)SNDMSG((hwnd), TVM_GETITEM, 0, (LPARAM)(TV_ITEM *)(pitem))
[22:56:39] <vаlexey> еще проще
[22:56:55] <vаlexey> Аццкий объем кода! Страшный макрос!
[22:57:15] <boris_ilov> Все равно макросы горазздо приятнее
[22:57:29] <boris_ilov> О!
[22:57:46] <boris_ilov> надо написать процедуры 1:1 как макросы с msdn
[22:58:01] <boris_ilov> но есть проблема
[22:58:10] <vаlexey> #define SNDMSG SendMessage
[22:58:13] <vаlexey> тупо
[22:59:31] <vаlexey> там макросов МНОГО
[22:59:43] <vаlexey> но ты можешь в ленивой манере их в процедуры превращать :-)
[23:00:02] <boris_ilov> надо нанять 1000 китайцев за еду
[23:00:28] <boris_ilov> они за час напишут
[23:00:44] <boris_ilov> за час много ккалорий не потратишь....
[23:00:51] <boris_ilov> куплю им по печеньке
[23:00:52] <vаlexey> Ж-)
[23:03:17] <boris_ilov> чет я не помню
[23:03:31] <boris_ilov> в CP сишные структуры забиваются нулями?
[23:03:38] <boris_ilov> memset то нету
[23:03:41] <vаlexey> по моему не совсем что-ли
[23:03:55] <vаlexey> или они забиваются а локальные переменные нет...
[23:03:59] <vаlexey> короче, надо репорт курить
[23:04:03] <boris_ilov> у меня порча памяти. не знаю где
[23:04:23] <boris_ilov> хм
[23:04:36] <boris_ilov> может это у меня порча памяти?
[23:04:53] <vаlexey> на вот тебе этот хедер: http://sourceforge.net/p/mingw/mingw-org-wsl/ci/21762bb4a1bd0c88c38eead03f59e8d994349e83/tree/include/commctrl.h
[23:05:29] <boris_ilov> вах! сенкс
[23:05:39] <vаlexey> оно даже не в студии есть, а в mingw
[23:06:29] <vаlexey> как и все остальное базовое winapi'шное
[23:06:48] <boris_ilov> valexey: Напиши плиз парсер с++... а!?
[23:06:52] <boris_ilov> :)
[23:07:03] <boris_ilov> будем хидеры автоматом конвертить
[23:07:49] <boris_ilov> неужели нет нормальной либы для этих целей
[23:07:53] <vаlexey> эмм... ты мне предлагаешь погрузиться в пучины шланга?
[23:07:59] <vаlexey> есть - шланг
[23:08:01] <vаlexey> clang
[23:08:05] <boris_ilov> ахахах
[23:08:34] <vаlexey> не, туда мне возможно придется погрузиться, если меня таки совратят на одну работу. там вообще содомия с плюсами будет та еще.
[23:08:38] <boris_ilov> Ты сейчас взрыв ассоциаций в моей голове устроил
[23:08:41] <vаlexey> шланг это будет самая простая часть
[23:08:47] <boris_ilov> аха
[23:08:52] <boris_ilov> шланг!
[23:08:57] <vаlexey> шланге!
[23:09:04] <vаlexey> кстати, по немецки шланге - это питон
[23:09:06] <vаlexey> точнее змея
[23:09:19] <vаlexey> оттуда словечко перекочевало в русский язык
[23:09:19] <boris_ilov> уууууууууух
[23:09:24] <boris_ilov> хватит
[23:09:28] <boris_ilov> :)
[23:09:51] <vаlexey> таким образом clang == python!
[23:10:14] <boris_ilov> как говорят "Ты сделал мою пятницу"
[23:10:19] <vаlexey> :-)
[23:10:42] <vаlexey> а работка та еще - автоматическая формальная верификация корректности плюсовых программ :-D
[23:10:44] <vаlexey> плюсового кода
[23:10:51] <boris_ilov> жесть
[23:11:12] <vаlexey> ага
[23:11:22] <vаlexey> ну, подмножества плюсового кода
[23:11:33] <vаlexey> да, верификатор должен сам себя верифицировать
[23:11:47] <vаlexey> (ну ясное дело оно на плюсах пишеццо)
[23:12:23] <boris_ilov> и ты хочешь поднять это корыто в воздух?
[23:12:30] <vаlexey> не, конечо вероятность того, что я этим буду заниматься я оцениваю меньше чем в 5 процентов. но тем не менее :-)
[23:13:34] <vаlexey> ну, типо спрос есть, то есть это корыто хотят в воздух поднять. один раз попытались - не вышло. теория у них вся там наработана вроде бы. но кодить академики не умеют :-) и в инструментарии аля шланг не разбираются.
[23:13:44] <vаlexey> вообще это нужно для mission critical software
[23:14:07] <boris_ilov> "и в инструментарии аля шланг не разбираются."
[23:14:14] <boris_ilov> я пацталом :D :D :D
[23:14:38] <boris_ilov> что за академики такие?
[23:14:40] <vаlexey> ну а чо? плюсы без шланга это боль и страдания ведь!
[23:14:48] <boris_ilov> со шлангом справиться не могут
[23:14:53] <vаlexey> таки российские. где-то в москвах обитают.
[23:15:18] <vаlexey> не, они именно математическую модель всего этого хозяйства построили и методы верификации построили
[23:15:28] <vаlexey> то есть алгоритмы как и чо.
[23:15:29] <boris_ilov> ахахаааааааааааааааааааа
[23:15:39] <boris_ilov> "математическую модель всего этого хозяйства построил"
[23:15:44] <vаlexey> это очень классно, ибо я например не особо представляю с какого конца там браться
[23:15:49] <boris_ilov> у меня уже слезы текут
[23:15:52] <vаlexey> в плане анализа семантики
[23:16:08] <boris_ilov> "с какого конца там браться"
[23:16:12] <vаlexey> собственно у них проблема в том, как на вход этому данные подать :-)
[23:16:12] <boris_ilov> жги!
[23:16:29] <boris_ilov> я плачу
[23:16:52] <vаlexey> черт. какую бы аналогию...
[23:16:55] <boris_ilov> уффф
[23:17:00] <vаlexey> ну вот ты знаешь что такое SAT-солверы?
[23:17:00] <boris_ilov> вот я похабник
[23:17:06] <boris_ilov> нет
[23:18:36] <vаlexey> это приложения которые за приемлемое время почти всегда решают 3SAT: http://en.wikipedia.org/wiki/3SAT#3-satisfiability
[23:19:00] <vаlexey> это NP-полная задача как бэ.
[23:19:30] <vаlexey> Во-от. На вход сат-солверу дается вот системка из этих 3сатов.
[23:19:36] <vаlexey> Он решает.
[23:19:56] <vаlexey> Любая NP-полная задача сводится к любой другой NP-полной задаче.
[23:20:17] <boris_ilov> ой у меня сейчас мозг такое не воспримет
[23:20:23] <vаlexey> Решение японского кроссворда - это NP-полная задача
[23:20:41] <vаlexey> Теперь твоя задача, как прогера, подать этот японский кроссворд на вход сат-солверу :-)
[23:20:46] <vаlexey> Чтобы он решил кроссворд.
[23:21:12] <boris_ilov> любопытно
[23:21:39] <vаlexey> Вот академики те - они как раз считай "сат-солвер" сделали, образно говоря, а моя задача - подать ему на вход японский кроссворд.
[23:21:40] <boris_ilov> У меня давно в голове идея крутится (их там у меня вообще тьмы ;))
[23:21:53] <boris_ilov> понятно
[23:22:12] <vаlexey> при этом академики ничего в японских кроссвордах не смыслят :-)
[23:22:27] <boris_ilov> Идея: Почему в языках не придумали отслеживать инварианты?
[23:22:45] <vаlexey> как не придумали? А как же Eiffel? А как же SPARK?
[23:23:00] <boris_ilov> вот не знаю то или нет
[23:23:04] <boris_ilov> щас пример приведу
[23:23:22] <boris_ilov> вот есть например функция Foo(int a): int;
[23:23:49] <boris_ilov> В ней в заголовке где то указывается инвариант для параметров
[23:24:08] <boris_ilov> INV a > 10 & a < 100
[23:24:44] <boris_ilov> Вот и при компиляции анализатор должен отследить что в местах вызова функции этот инвариант гарантирован
[23:24:52] <boris_ilov> т.е.
[23:25:27] <vаlexey> дык, SPARK же
[23:25:28] <vаlexey> и Ада же
[23:25:37] <boris_ilov> a = 1;
IF a > 10 & a < 100 THEN
foo(a);
END
[23:25:53] <boris_ilov> типа еслиб условия не было, то ругнулось бы
[23:25:57] <vаlexey> и эйфель же
[23:26:02] <vаlexey> это ж классическое предусловие
[23:26:05] <boris_ilov> реально прям так?
[23:26:35] <boris_ilov> мне кажется что довольно сложно отследить по коду инвариант для конкретной переменной
[23:26:36] <vаlexey> угу. семантически так. причем это будет либо исключение, либо ошибка компиляции если компилер это может вычленить на этапе компиляции
[23:27:05] <boris_ilov> не я именно про отслеживание на этапе компилции
[23:27:18] <boris_ilov> чтобы в рантайме проверокк не было вообще
[23:27:20] <vаlexey> тем более что то что ты написал - это тупо диапазон. в Аде это есть с самого начала. Банально тип задаешь с диапазоном от 11 до 99 и все.
[23:27:41] <boris_ilov> а как это отслеживается?
[23:27:44] <vаlexey> А не выйдет. Представь себе что у тебя туда результат ввода с консоли суют.
[23:27:47] <boris_ilov> теория есть какая то?
[23:28:20] <boris_ilov> ну с консоли должна другая процедура принимать и проверять уусловия перед вызовом
[23:28:47] <vаlexey> Ну вот и проверили :-) После чего у тебя число гарантированно ложится в этот диапазон. Тип же этот же.
[23:28:47] <boris_ilov> т.е. при анализе кода
[23:28:59] <vаlexey> Короче, покури Аду
[23:29:05] <vаlexey> хотя бы.
[23:29:07] <vаlexey> для начала
[23:29:20] <boris_ilov> а что именно курить?
[23:29:28] <boris_ilov> типы это точно не то
[23:29:38] <vаlexey> http://ada-ru.org/V-0.4w/index.html
[23:29:47] <vаlexey> типы - там диапазоны как раз.
[23:30:06] <vаlexey> при касте в этот тип идет как раз проверка выхода значения за границы
[23:30:19] <vаlexey> если скастовалось успешно, значит оно удовлетворяет.
[23:30:37] <vаlexey> единственное что меня постоянно смущает во всех этих языках - так это арифметические операции
[23:30:45] <boris_ilov> это не то
[23:31:05] <boris_ilov> проверок быть не должно
[23:31:10] <boris_ilov> в этом и суть
[23:31:17] <vаlexey> по идее int(n)+int(n) = int(n+1)
[23:31:21] <vаlexey> в случае типов
[23:31:33] <vаlexey> от проверок ты один фиг никуда не денешься
[23:31:51] <boris_ilov> вот идея в том чтобы делся
[23:31:54] <vаlexey> если у тебя есть хотя бы одно значение (число итераций, или просто переменная) не известная на этапе компиляции.
[23:32:00] <vаlexey> это ж задача о останове
[23:32:16] <boris_ilov> поголе щас объясню в чем суть
[23:32:20] <boris_ilov> погоди
[23:32:27] <boris_ilov> вот есть код
[23:32:33] <boris_ilov> какой то алгоритм
[23:32:42] <boris_ilov> в нем есть переменная
[23:32:57] <boris_ilov> a: BYTE;
[23:33:18] <boris_ilov> в месте объявления ей присваивается инвариант
[23:33:35] <boris_ilov> т.е. компилятор запоминает в некой структуре что
[23:33:57] <boris_ilov> a > 0 & a < 256
[23:34:17] <boris_ilov> Далее если встречается такой код
[23:34:27] <boris_ilov> IF a > 10 THEN ....
[23:34:40] <boris_ilov> то внутри IF инвариант становится уже
[23:34:48] <boris_ilov> a> 10 & a< 256
[23:34:52] <boris_ilov> и т.д.
[23:35:08] <boris_ilov> а если эта переменная передается в процедуру
[23:35:15] <vаlexey> дак а на что этот инвариант вообще влияет то?
[23:35:22] <vаlexey> ведь компилятор гарантировать его никак не сможет
[23:35:29] <boris_ilov> то компилер сравнивает текущий инвариант с предусловием процедуры
[23:35:49] <boris_ilov> ну набор условий этих
[23:35:58] <vаlexey> это будет течь
[23:36:07] <boris_ilov> можно придумать структуру под это дело думаю....
[23:36:12] <vаlexey> WHILE flag DO INC(a) END;
[23:36:15] <vаlexey> после твоего ифа
[23:36:18] <vаlexey> и всё. привет.
[23:36:25] <vаlexey> компилятор тут ничего уже не гарантирует.
[23:36:39] <boris_ilov> Ну а чего
[23:36:49] <boris_ilov> инвариант смещается на единицу и все
[23:36:56] <vаlexey> почему на единицу? :-)
[23:37:01] <boris_ilov> INC
[23:37:08] <vаlexey> мы не знаем сколько итареций сделает цикл :-D
[23:37:11] <vаlexey> никто не знает
[23:37:28] <boris_ilov> значит становится
[23:37:34] <boris_ilov> a > 10
[23:37:43] <boris_ilov> в том и смысл
[23:37:47] <vаlexey> переполнение будет :-)
[23:37:51] <boris_ilov> пофиг
[23:37:51] <vаlexey> и а может стать нулем
[23:37:56] <vаlexey> :-D
[23:38:08] <vаlexey> или двойкой
[23:38:20] <boris_ilov> главное что в момент сравнения с предусловием инвариант будет известен
[23:38:28] <boris_ilov> таким какой он получается по коду
[23:38:46] <boris_ilov> пусть будет инвариант
[23:38:54] <vаlexey> IF a > 10 THEN WHILE flag DO INC(a) END; FooBar(a); END;
[23:38:54] <boris_ilov> a = ЧТОУГОДНО
[23:39:02] <boris_ilov> это тоже хорошо
[23:39:30] <boris_ilov> ну да ну да :)
[23:39:43] <boris_ilov> вот мне и интересно есть какие работы на эту тему?
[23:39:47] <vаlexey> не, такое конечно сделать можно. это не инварианты.. а как бы это сказать... прикинуть чо у нас где в автоматическом режиме
[23:39:53] <boris_ilov> есть там какие доказательства и выводы?
[23:40:05] <vаlexey> таким же вот образом вывод типов в erlang'e работает
[23:40:09] <vаlexey> алгоритм такой же
[23:40:21] <vаlexey> что б ты понимал - erlang -- динамически типизированный язык
[23:40:27] <vаlexey> анотаций типов там считай и нет.
[23:40:38] <boris_ilov> вывод типов да
[23:40:43] <boris_ilov> что-то похожее
[23:40:43] <vаlexey> но есть тулза, которая может вычислить типы.
[23:41:05] <vаlexey> и оно на выходе тебе скажет что вот переменная a у тебя может быть (в зависимости от того как звезды сложатся) типом B,C,D
[23:41:08] <boris_ilov> меня интересует вот мое описание с точки зрения математики
[23:41:13] <vаlexey> а вот другого типа она не будет палюбому
[23:41:19] <boris_ilov> ээто разрешимая задача или нет?
[23:41:34] <vаlexey> см то что я написал про erlang - это в точности та же задача
[23:41:56] <vаlexey> ибо поскольку erlang динамически типизирован, значением переменных является и тип
[23:42:10] <boris_ilov> типы вроде Уже чем инварианты
[23:42:14] <boris_ilov> разве нет?
[23:42:17] <vаlexey> неа
[23:42:26] <vаlexey> это равномощные понятия
[23:42:43] <boris_ilov> ну вот в Обероне явно уже
[23:42:47] <boris_ilov> :)
[23:42:51] <vаlexey> да, чтоб ты понимал - эта штука в ерланге работает не запуская твою прогу на исполнение
[23:42:56] <vаlexey> оно просто анализирует исходник
[23:43:41] <boris_ilov> А как предусловия в процедурах задаются?
[23:43:49] <boris_ilov> функциях*
[23:43:56] <vаlexey> анотацией типа :-)
[23:44:09] <boris_ilov> хм
[23:44:15] <boris_ilov> а в Haskell это есть?
[23:44:24] <vаlexey> очень полезно когда сторонняя либа, без док. и фиг знает чо вот эта функция вернуть может (типизация динамическая - значение может быть ЛЮБОГО типа)
[23:44:45] <vаlexey> напускаешь на эту либу эту тулзу - оно выдает перечен типов который может из нее вылететь
[23:45:07] <vаlexey> ну: в хаскеле все проще - там же статическая а не динамическая типизация
[23:45:23] <vаlexey> там вывод типов принципиально другой и не похож на твою задачу.
[23:45:51] <boris_ilov> а для статически типизированных языков такие фичи есть?
[23:45:57] <boris_ilov> строго*
[23:46:10] <boris_ilov> не функцционльных
[23:46:19] <vаlexey> ну: см. хаскель тот же. там инварианты гарантируют типизацией. пытаются. но это несколько не то что тебе нужно
[23:46:27] <vаlexey> у тебя штука не строгая по описанию получилась
[23:46:38] <vаlexey> а в хаскеле строгая и очень мозголомная
[23:47:04] <boris_ilov> она строггая в том смывсле что компилятор не даст вызвать процедуру если не гарантированы 100% предусловия
[23:47:12] <vаlexey> ну, то есть та тулза которая для ерланга: если бы ее напустить на твою Lua-прогу проставила бы типы для всех функций :-)
[23:48:01] <boris_ilov> ругнется типа: У тебя эта переменная может быть любого значения а процедура хочет > 100
[23:48:12] <boris_ilov> оберни в условие или иди лесом
[23:48:12] <vаlexey> То есть тут не даст вызвать, если FooBar хочет аргумент больше 10?: IF a > 10 THEN WHILE flag DO INC(a) END; FooBar(a); END;
[23:48:49] <boris_ilov> даст
[23:48:54] <vаlexey> И будет не право
[23:49:00] <boris_ilov> ну блин
[23:49:05] <vаlexey> Ибо a может окззаться двойкой :-)
[23:49:09] <boris_ilov> конечно с отслеживанием переполнения
[23:49:16] <vаlexey> В рантайме?
[23:49:23] <boris_ilov> не знаю
[23:49:23] <vаlexey> В компайл-тайме ты ничего не проверишь
[23:49:36] <boris_ilov> а может и в рантайме
[23:49:40] <boris_ilov> ой
[23:49:44] <boris_ilov> в компилтайме
[23:49:52] <vаlexey> на этапе компиляции это не проверяется
[23:49:54] <boris_ilov> ругнется что нельзя такой цикл делать
[23:50:02] <boris_ilov> проверяется
[23:50:06] <vаlexey> скорее надо будет еще один if воткнуть
[23:50:15] <vаlexey> ибо любое изменение a ломает инварианты
[23:50:30] <boris_ilov> компилер может проверить что в шапке цикла не отслеживается размер переменной
[23:50:40] <boris_ilov> т.е. потенциальный выходд за диапазон
[23:50:51] <vаlexey> короче, ближе к телу - схожим образом в Kotlin'e борются с null dereference
[23:51:43] <boris_ilov> хм
[23:51:57] <boris_ilov> надо покурить все эти эрланги с колинами
[23:51:59] <boris_ilov> :)
[23:52:02] <vаlexey> http://confluence.jetbrains.com/display/Kotlin/Null-safety
[23:52:22] <vаlexey> оно не функциональное
[23:52:33] <boris_ilov> это гуд
[23:53:31] <vаlexey> ну, то есть не более функциональное чем плюсы скажем :-) или lua
[23:53:40] <vаlexey> лямбды и замыкания там есть конечно
[23:53:50] <vаlexey> ну и иммутабельные переменные тоже
[23:53:56] <vаlexey> (но есть и мутабельнае)
[23:55:35] <vаlexey> http://confluence.jetbrains.com/display/Kotlin/Type+casts
[23:55:39] <vаlexey> до кучи
[23:55:52] <boris_ilov> знаешь что интересно в этой задаче
[23:56:04] <vаlexey> ?
[23:56:08] <boris_ilov> она на первый взгляд NP полная
[23:56:16] <boris_ilov> и на второй тоже
[23:56:28] <vаlexey> ну, вывод типов в Haskell - NP-полон
[23:56:37] <boris_ilov> А ведь именно эту задачу должен решить идеальный кодер
[23:56:50] <boris_ilov> т.е. безошибочный
[23:56:59] <boris_ilov> вот
[23:57:01] <vаlexey> Ну, человеческий моск вообще хорошо NP-полные задачи решает :-)
[23:57:11] <boris_ilov> вот вопрос
[23:57:24] <boris_ilov> способен ли человек с ней справиться
[23:57:33] <boris_ilov> и каковы границы возможностей
[23:57:49] <vаlexey> человек в принципе ни с одной задачей не может безошибочно справиться
[23:57:58] <boris_ilov> Все эти ратования info21 за грамотное программирование....
[23:58:22] <vаlexey> но в среднем человек NP-задачки с помощью эвристик и такой-то матери, решает неплохо.
[23:58:27] <boris_ilov> Ну понятно что есть средний предел для среднего кодера
[23:58:30] <boris_ilov> вот каков он?
[23:58:33] <vаlexey> но не безошибочно
[23:58:44] <boris_ilov> 100 строк?
[23:58:46] <boris_ilov> 1000?
[23:58:50] <boris_ilov> 10000?
[23:58:57] <vаlexey> зависит от задачи и от кода ведь
[23:59:03] <boris_ilov> сюда же число милнера
[23:59:13] <boris_ilov> угу
[23:59:26] <vаlexey> я ведь уже говорил что я не доверяю своим глазам, своему мнению и мыслям? и предпочитаю перепроверять из нескольких источников все важное? :-)
[23:59:49] <boris_ilov> Миллера
[23:59:51] <vаlexey> ибо ошибается любой. особенно человек. особенно когда он в себе уверен :-)