[01:19:22] <vlad2> Проблема с енумами в switch проще решается: не использовать default, смотреть варнинги компилятора (сделать их ошибками)
[08:56:03] <Kemet> vlad2, А что с Free() не так? Никогда с ним проблем не испытывал
[12:09:36] <kemiisto> Ну что там? Нашёл Kemet уже жизненные смыслы или всё ещё нет?
[12:09:42] <kemiisto> :-D
[14:39:04] <Kemet> kemiisto, не, времени нет
[16:14:14] <Kemet> ну вот зачем так писать if(sLength<0 ? *s==0 : sLength==0) {
[16:28:49] <_valexey_> Почему нет?
[16:28:57] <_valexey_> Всё ясно же.
[16:29:55] <Kemet> не нравятся мне такие вещи
[16:30:10] <Kemet> в ифах и ретурнах
[16:30:14] <_valexey_> А мне нравятся :-)
[16:30:55] <_valexey_> Но, конечно, не совсем многоэтажные.
[16:31:06] <Kemet> кста, что будет во втором i перед вызовом
f( i++, i )
[16:31:46] <_valexey_> undefined behavior будет :-)
[16:31:59] <Kemet> b rrf ;bnm
[16:32:10] <Kemet> И как жить
[16:32:27] <_valexey_> Точнее небось будет unspecified behavior
[16:32:45] <Kemet> в певом, как я погниимаю будет старое значение?, до инкремента
[16:32:58] <_valexey_> Но с того не легче :-)
[16:33:13] <_valexey_> Как жить.. Язык знать!
[16:33:26] <Kemet> так это не мой кот
[16:36:47] <_valexey_> If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
[16:37:04] <_valexey_> Таки undefined
[16:37:41] <_valexey_> Если убрать из языка операторы ++, -- и ?, то это никак не поможет в данном случае
[16:37:51] <_valexey_> Думаю это очевидно
[16:38:21] <_valexey_> А что в обероне будет?
[16:39:26] <Kemet> в даннм случак ничего не будет, ибо там нет ++
[16:40:31] <Kemet> это будет f(i+1, i)
[16:40:35] <_valexey_> Но ты ж понимаешь, что это не поможет? :-)
[16:41:13] <_valexey_> Функции с побочными эффектами там один фиг есть.
[16:41:35] <Kemet> в Обероне порядок вычисления аргументов - слева-на-право, и только затем вызывается функцмия
[16:42:42] <Kemet> а с учетом, что тут по значению, то и после выполнения функции никаких бехавиоров
[16:42:55] <_valexey_> Во всех оберонах в репортах так и написано?
[16:43:09] <Kemet> не помню
[16:43:20] <_valexey_> Я давно в репорт не смотрел
[16:43:32] <Kemet> но, как сказал Бог, - этож здравый смысл!
[16:43:49] <_valexey_> Просто это может быть не фичей языка, а особенностью конкретной реализации.
[16:44:23] <Kemet> ну вроде везде так
[16:44:32] <_valexey_> Вот поэтому оберон будет всегда тормознее плюсов :-)
[16:44:37] <Kemet> а вот в дельфе я пару раз наступал, да
[16:44:49] <_valexey_> Хотя...
[16:44:51] <Kemet> ибо порядок вычисления не определен
[16:44:56] <_valexey_> Надо подумать
[16:46:40] <Kemet> ну в целом, переупорядочиывание вычисления аргументов это для оптимизации да, и если в одном вызове есть ссылки на одину и ту же переменную, то сущи весла
[16:47:08] <Kemet> а еслиивсе по значению, то норм
[16:49:32] <_valexey_> По значению может передаваться по ссылке в некоторых языках,если это выгодно
[16:49:43] <Kemet> но, в целом, за исклюбчением отдельных беховиоров, кот с C++ легко переписывается на АО. Есть некоторые тонкости с конструткорами и операциями, но  в целом, я сечас практичсеки открыл исходник C++ и перебил на АО
[16:49:47] <_valexey_> В некоторых реализациях
[16:50:09] <_valexey_> Попробуй буст переписать :-)
[16:50:26] <Kemet> но от кодестайлинга зависит, тоже
[16:50:28] <_valexey_> Код плюсатый очень разный бывает.
[16:50:50] <Kemet> угу
[16:51:08] <_valexey_> Есть тот, который работает только во время компиляции например.
[16:52:03] <Kemet> ну иногда ссылка заменяется на значение, если допустимо и если выгодно, да,Ю но вряд ли наоборот, ибо косвенная
[16:52:56] <_valexey_> Заменяется.
[16:53:01] <_valexey_> В аде например
[16:53:02] <Kemet> CONST a может заменяится тоже на VALUE a
[16:53:28] <_valexey_> Какой смысл копировать огромный объект, если он не будет меняться?
[16:53:58] <_valexey_> Объект тут не в смысле ооп, а в смысле переменная
[16:54:02] <_valexey_> Любого типа
[16:57:05] <Kemet> в А2, как раз, есть такие места, где массивы и записи передаются по значению, ибо многопоточка и нужна немутабельная переменная, чтобы не случился нежданчик
[16:57:51] <Kemet> поэтому если коомпиль поменяет по значению на по ссылке, то надо такой компиль убить
[16:59:03] <_valexey_> Компилю просто надо дать знать про такую особенность.
[16:59:20] <_valexey_> в плюсах и сях я знаю как это сделать
[16:59:31] <_valexey_> Про аду надо смотреть.
[17:01:35] <Kemet> ну в Обероне можно передать по CONST, но в екущих реализациях это не гарантирует, что в дальнейших вызовах это соглашение будет соблюдено
[17:04:19] <Kemet> понятно, что если передается 4 инта, то смысла менять value на ref нет
[17:12:52] <vlad2> Kemet: проблема не в Free как таковом, а когда он используется совместено с деструкторами (пришел из паскальной либы в С++). Когда-то в спорах с паскалистами озвучивался такой аргумент, что Free (в отличие от деструктора С++) позволяет вызывать виртуальные функции. Так вот, со временем пришло понимание, что это не достоинство, а недостаток. Логика разрушения должна быть максимально жесткой и контроллироваться компилятором. Т.е., грубо говоря, для сложных объектов деструктор должен быть дефолтовый (сгенерированный компилятором). Как только появляется ручная логика типа вызвать специальный перегруженный метод перед разрушением объекта - то все, костыли начинают расползаться по всей иерархии объектов.
[17:21:42] <vlad2> То же самое, кстати, касается и виртуальных Create()/Init(). Типа мы пока инициализируем базу хотим позвать перегруженный метод, который вернет нам нужые параметры. Ах, в С++ мы не можем этого сделать, а в паскале можем. Убогий С++ :) Делать нечего, сделаем виртуальный Init() - и понеслась. Хотя на самом деле проблема решается элегантнее просто спусканием в базу нужного колбэка/фабрики. При этом классы перестают быть монструозными контейнерами кучи перегруженных функций, легче тестируются и проще рефакторятся.
[17:23:20] <Kemet> vlad2: ну хз, Free() это не деструктор, а метод, который вызывает деструктор, предварительно пароверив допустимость такого вызова
[17:30:25] <vlad2> Угу. Вот эта проверка - тоже зло :) В общем случае ты не хочешь иметь дела с ситуацией когда объект отказался уничтожаться. Вот ты окошко закрываешь, а одна кнопка (последняя из уже 10 уничтоженных) отказалась уничтожаться :) И что ты будешь делать? Понятно, что есть специальные случаи - типа спросить пользователя готов ли он закрыть окно - такие случае оформляются и обрабытываются отдельно (TryToClose), с перегрузками и т.д. нетривиальной логикой.
[17:48:59] <Kemet> vlad2, Это ж специфика - конструторы в Дельфи статические и если чтотг пошло не так при создании экземпляра, то ссылки может не быть. Free это особый метод, к которому можнр обратиться и в этом случае, он проверит self и вызовет виртуальный деструктор. вряд ли в Free стоит закладывать иную логику
[17:52:34] <Kemet> вроде этоо Free вообще не перегружается
[17:52:44] <Kemet> счас не помню
[18:14:45] <Kemet> ну то есть я не вижу тут никаких проблем - сочетание статические конструкторы и виртуальные деструкторы требуют некоторого осознанного подхода. возможно, это можно было сделать элегантней, но уж такой дизайн языка
[21:18:50] <kemiisto> (7:14:38 PM) Kemet left the room.
(8:09:37 PM) Kemet entered the room.
(8:12:46 PM) Kemet left the room.
[21:18:55] <kemiisto> =-O
[21:19:10] <kemiisto> Миниатюра: Kemet ищет жизненные смыслы.
[21:19:16] <kemiisto> :-D
[21:19:30] <kemiisto> не там ищет, вот