[17:36:10] <geniepro> эстонский расизм в этой вашей "просвещённое" гейропе https://www.facebook.com/timkirbyrussia/posts/10156900066541303
[17:36:39] <geniepro> https://scontent.fala4-1.fna.fbcdn.net/v/t1.0-9/49661539_10218400048849575_4912951134991155200_n.jpg?_nc_cat=105&_nc_ht=scontent.fala4-1.fna&oh=492fb83c3f7496f7c0cf039be3bf3f7a&oe=5CBD4C35
[17:37:37] <valexey> правильно. для русских есть скамейка, а для эстонцев нет
[17:37:45] <valexey> суровый эстонский расизм, однако!
[17:38:40] <TRUE> а украинцы вообще в пролёте
[17:41:48] <Kemet> В Активном Обероне мне темерь не хватает нормальных автоматических деструкторов
[17:42:50] <valexey> Kemet: это ты где таких вредных привычек нахватался?
[17:43:41] <geniepro> valexey: ну это просто эстонцы тормознули со скамейкой, не догадались про неё
[17:48:21] <Kemet> valexey, ну, в локфри версии они таки есть, деструкторы эти, но не уверен, ч о они срабатывают в момент выхода из скопа
[17:48:53] <valexey> Kemet: дык, а пристрастился то ты к ним где?
[17:49:19] <Kemet> valexey, а нужны они мне чтобы гарантированно освобождать ресурсы при схлопывании стека, при выходе из скопа проедуры и тд
[17:49:55] <valexey> Kemet: use c++!
[17:50:02] <valexey> ну, то есть реально же удобно
[17:50:24] <valexey> и безопасность повышает
[17:51:58] <Kemet> Чч обы не писать
Mutex.Enter
....
Mutex.Exit
, ибо это  и забыть можно разлочить, и грохнуться может, придется секцию финалли городить, а если есть деструктор, то он сам все сделает
[17:52:47] <valexey> конкретно для этого в Go например есть defer
[17:53:04] <valexey> а в жабе - finally секция
[17:53:10] <Kemet> Да , вот в связи с безопасностью мне это и нужно
[17:53:17] <valexey> да и в модуле-3 вроде тоже что-то такое есть
[17:53:22] <geniepro> https://github.com/aixp/rops редактор для оберона, написанный на питоне... ну, больше тут ничего и не скажешь...
[17:54:02] <Kemet> Да finally в ао есть, но это все не решает, не ф налли ни дефер
[17:54:25] <valexey> да, один фиг два раза писать приходится. а хочется один раз.
[17:54:28] <valexey> RAII рулид
[17:54:41] <valexey> вот using из шарпа думаю зашел бы. или из питона
[17:55:29] <Kemet> В Модуле3 есть
LOCK x
Blabla
END
Но это частное решение для мьютек,а
[17:55:40] <geniepro> а в како-нить лиспе или хаскелле любой может сгородить свой using, не дожидаясь, когда его добавят в язык
[17:56:28] <valexey> geniepro: а для RAII полноценного? :-)
[17:56:51] <geniepro> приведи пример "полноценного RAII"
[17:57:54] <valexey> когда время жизни переменной не скоп.
[17:58:10] <valexey> ресурс может быть захвачен в поле структуры например
[17:58:21] <valexey> и каким-нибудь скопом одновременно
[17:58:27] <valexey> и другим полем
[17:58:58] <geniepro> есть всякие, утверждающие, что "RAII is better than the bracket pattern" https://www.snoyman.com/blog/2018/10/raii-better-than-bracket-pattern
https://news.ycombinator.com/item?id=18172780
ну хз, хз...
[17:59:30] <geniepro> valexey: по-моему это всё ошибки в архитектуре
[18:04:12] <geniepro> valexey> когда время жизни переменной не скоп.
как я понимаю, этот случай уже не подпадает под само понятие RAII
[18:05:41] <valexey> подходит
[18:05:52] <geniepro> нечто подобное, кстати, есть в аде -- создаёшь в блоке новый тип данных, создаёшь переменные этого типа, а когда происходит выход из блока, все переменные этого локального типа тут же уничтожаются...
[18:07:29] <valexey> в Аде есть и полноценный RAII. Через задницу немного, но есть.
[18:07:31] <geniepro> valexey: https://ru.wikipedia.org/wiki/Получение_ресурса_есть_инициализация
Суть идиомы RAII в том, что класс инкапсулирует владение (захват и освобождение) некоторого ресурса — например, открытого файлового дескриптора. Когда объекты-экземпляры такого класса являются автоматическими переменными, гарантируется, что когда они выйдут из области видимости, будет вызван их деструктор — а значит, ресурс будет освобождён. В данном примере файл будет закрыт корректно, даже если вызов std::fopen() вернёт ошибку и будет возбуждено исключение. Более того, если конструктор класса file завершился корректно, это гарантирует то, что файл действительно открыт. В случае ошибки при открытии файла конструктор возбуждает исключение.

тут речь как раз про scope
[18:08:04] <valexey> речь про время жизни. а время жизни - это не обязательно локальный скоп внутри блока.
[18:09:19] <geniepro> и вообще в самом названии "Получение ресурса есть инициализация (англ. Resource Acquisition Is Initialization (RAII))" ничего не говорится про освобождение ресурса, только про его получение с инициализацией, ну вот буквально так!
[18:11:53] <geniepro> std::mutex m;

void bad()
{
   m.lock();                    // acquire the mutex
   f();                         // if f() throws an exception, the mutex is never released
   if(!everything_ok()) return; // early return, the mutex is never released
   m.unlock();                  // if bad() reaches this statement, the mutex is released
}

void good()
{
   std::lock_guard<std::mutex> lk(m); // RAII class: mutex acquisition is initialization
   f();                               // if f() throws an exception, the mutex is released
   if(!everything_ok()) return;       // early return, the mutex is released
}                                      // if good() returns normally, the mutex is released
[18:12:15] <geniepro> если у тебя подобный ресурс засовывается хз куда, то ты сам себе стреляешь в ногу
[18:13:31] <valexey> глянь std::shared_ptr
[18:13:51] <geniepro> http://www.stroustrup.com/bs_faq2.html#finally
Why doesn't C++ provide a "finally" construct?
Because C++ supports an alternative that is almost always better: The "resource acquisition is initialization" technique (TC++PL3 section 14.4). The basic idea is to represent a resource by a local object, so that the local object's destructor will release the resource. That way, the programmer cannot forget to release the resource.
[18:14:12] <geniepro> сам страуструп говорит, что подобные ресурсы должны быть локальными
[18:14:29] <geniepro> а всякие твои придумки с нелокальными ресурсами -- это от лукавого!!!
[18:15:04] <valexey> RAII мощнее чем файнали. вот и всё.
[18:15:28] <geniepro> кстати, в с++билдере есть finally!!! и это гораздо удобнее, чем упарываться созданием подобных RAII-механизмов направо и налево
[18:16:28] <geniepro> In a system, we need a "resource handle" class for each resource. However, we don't have to have an "finally" clause for each acquisition of a resource. In realistic systems, there are far more resource acquisitions than kinds of resources, so the "resource acquisition is initialization" technique leads to less code than use of a "finally" construct.

ну вот чоза гемор????
[18:18:09] <geniepro> хаскельный bracket pattern вполне норм, чо им не нравится???
import Control.Exception (bracket)

data MyResource = MyResource

newMyResource :: IO MyResource
newMyResource = do
 putStrLn "Creating a new MyResource"
 pure MyResource

closeMyResource :: MyResource -> IO ()
closeMyResource MyResource = putStrLn "Closing MyResource"

withMyResource :: (MyResource -> IO a) -> IO a
withMyResource = bracket newMyResource closeMyResource

useMyResource :: MyResource -> IO ()
useMyResource MyResource = putStrLn "Using MyResource"

main :: IO ()
main = withMyResource useMyResource
[18:18:24] <valexey> опять какой-то птичий язык...
[18:18:42] <valexey> перепиши на понятном всем Обероне!
[18:19:03] <geniepro> ну тут хотя бы нет закорючек вшивого си-с++
[18:19:41] <geniepro> а буберон такого не умеет, ибо слишком примитивный язычок
[18:19:46] <valexey> да, зато есть закорючки вшивого хаскеля
[18:20:03] <geniepro> нету закорючек же, покажи хоть одну???
[18:22:37] <geniepro> лол, в хаскельчате сделали опрос "что сложнее -- хаскель или русский?"
1 голос за то, что хаскель сложнее, и 14 голосов, за то что русский сложнее )))
[18:25:21] <valexey> :: (MyResource -> IO a) -> IO a
Вот это что за хрень ваще? Доступ к полю по указателю?
[18:25:33] <valexey> невнятные закорюки
[18:25:42] <valexey> нет чтобы словами написать что к чему...
[18:31:57] <geniepro> где ты там ваще указатели увидел? о_О
[18:33:02] <valexey> ну вот MyResource это явно указатель на объект, а IO это поле этого объекта
[18:33:03] <geniepro> кстати, для сишников: https://cdecl.org
[18:33:06] <valexey> очевидно же!
[18:33:16] <geniepro> declare foo as pointer to function (pointer to const void) returning pointer to array 3 of int
int (*(*foo)(const void *))[3]
[18:33:33] <geniepro> int (*(*foo)(void ))[3]
declare foo as pointer to function (void) returning pointer to array 3 of int
[18:34:09] <geniepro> valexey: не вижу никакой очевидности!!! забудь сишечку уже!!!
[18:35:30] <valexey> ну вот, синтаксис хаскеля не интуитивно понятен и полон невнятных закорюк. могли бы и более адекватный синтаксис сделать
[18:35:49] <valexey> или чтобы он был уже понятен и знаком всем, то есть стандартен, либо словами бы всё написали.
[18:36:38] <Kemet> Но вообще, я ду аю, это можно построить на автоматической секции финалли, если есть некое указание, что нужно дестроить при выходе из скопа. Просто компилятор вставит финалли и вызов деструктора
[18:38:50] <geniepro> как раз вполне интуитивно понятный! значение MyResource превращается в IO a, а всё это снова превращается в IO a
[18:39:39] <geniepro> Kemet: тогда тебе надо будет в заголовке блока TRY указывать, какой объект должен быть зафинален
[18:42:14] <Kemet> geniepro, в ао нет Трай, там просто секция finally в процедуре
[18:43:02] <geniepro> Kemet: но тогда как ты сделаешь "некое указание, что нужно дестроить при выходе из скопа"?
[18:43:15] <valexey> прагмами всё обмазать!
[18:43:21] <valexey> все нужные переменные!
[18:43:37] <geniepro> вот кстати насчёт прагм
[18:43:53] <Kemet> geniepro, так деструктор в тип загнать , с указанием, ч о ав оматический
[18:44:54] <geniepro> нафига эти оберонщеги и блекбоксёры выдумывают всякие [что-то там] в описаниях записей и процедур? это же нарушает грамматику языка! вот делали бы в виде спец-коментариев
[18:45:19] <valexey> просто в виде прагм хотя бы
[18:45:51] <valexey> более того, в Обероне-2 (точнее в дубовых требованиях) прямо было описано как можно язык расширять этими прагмами, чтобы не ломать совместимость.
[18:46:01] <valexey> и синтаксис был и всякое такоэ
[18:46:34] <valexey> но, видимо, оказалось, что совместимость нафиг не нужна. общей кодовой базы в оберонах нет для прикладников, потому совместимость между реализациями можно не поддерживать.
[18:46:46] <valexey> тем более что её там нет не только на уровне синтаксиса, но и на уровне семантики.
[18:47:26] <valexey> а экспериментировать, модифицируя язык, проще чем не модифицируя его. когда язык настолько простой и деревянный.
[18:47:48] <Kemet> geniepro, это никак не нарушает синтаксис языка, в активном обероне есть конструкторы и деструкторы, они помечаются днаками & и ~ соотвественно
[18:51:04] <Kemet> И если я введу вмес о знаков & и ~ , например && и ~~, которые как раз и будут работать нужно, или модификатор для типа, который указывает, ч о это вот ав оматический тип, то тоже ничего не нарушу
[18:51:06] <geniepro> Kemet: разве вот это вот:
PROCEDURE [winapi, "kernel32.dll", "ExitProcess"]  ExitProcess (code: INTEGER);
соответствует виртовскому оберону???
[18:51:31] <valexey> а откуда там виртовский оберон? это ж вообще не оберон. это явно компонентный ПАСКАЛЬ
[18:51:46] <geniepro> вапще-то это акроновский компилятор оберона-07
[18:52:01] <valexey> оу
[18:52:07] <valexey> ваще ересь-ересь
[18:52:11] <valexey> это явно не оберон-07
[18:52:29] <geniepro> вот эту часть [winapi, "kernel32.dll", "ExitProcess"] надо было делать в виде спец коммента
[18:52:41] <valexey> ну, формально да.
[18:52:58] <Kemet> Нет
[18:53:21] <geniepro> Kemet: при вирте такой херни не было!!!
[18:53:37] <valexey> либо модули, которые содержат в себе такое деражать в файлах с другим расширением, которое явно указывало бы, что тут не оберон, а ЕРЕСЬ
[18:54:03] <Kemet> Семантика долдна быть явно указана а не ко ментарии лепить, потому ч о она не долдно ко пилиться если компилятор не поддердивает такую семантику
[18:54:37] <valexey> почему же? пусть компилится. это позволит замокать эти функции в другом компиляторе, если это нужно.
[18:55:54] <Kemet> Ну выноси в отдельный модуль, кто мешает, но мне то пофиг, я про ао говорю, а не про о7
[18:57:20] <Kemet> А в АО  могу добавить модификатор, не изменяя синтаксиса
[18:57:21] <valexey> и вот в этом и есть вся проблема оберонов
[18:59:18] <valexey> их слишком уж дофига.
[19:00:17] <Kemet> В Обероне есть одна проблема - изначально это закуклившаяся моносреда, и когда ее раскупориваешь, внезапно оказывается, ч о нужны механизмы связи с хостом, на котором все другое, включая соглашение о вызове , вот и придумывают кто ч о может, ну загонят в прагмы, так оно не правильно скомпилируется на ко пиляторе который это не понимает
[19:02:32] <valexey> https://github.com/sharkdp/hexyl
[19:02:35] <Kemet> В старом ко пиляторе ао можно было пихать модификаторы, и поф г, что они не опредеьены, это как раз такой путь, как со смецкомментариями, мне такое не нужно, если чего то нет, оно не должно ко пилироваться
[19:02:38] <valexey> кажется довольно удобная штука
[19:03:16] <geniepro> Kemet: А разгадка одна - безблагодатность! ой! отсутствие стандарта на оберон!
[19:04:45] <geniepro> недавно удивлялся, почему нет ГОСТа на модулу-2, так, оказывается, ISO-стандарт модулы-2 приняли после распада СССР уже, вот в Союзе не успели стандартизировать
[19:05:04] <Kemet> geniepro, если бы был стандарт, его бы не использовали, ну вот есть дубовые требования, так они дубовые, мало кому нужны
[19:05:07] <geniepro> в ISO модуле-2 есть не только комплексные числа, но и исключения, кстати
[19:05:12] <valexey> дык были дубовые требования -- но ими всё подтёрлись.
[19:05:48] <geniepro> так эти ваши дубовые требования не стали никаким ISO-стандартом, конечно все ими подтёрлись, ибо не имеют законодательной силы
[19:06:11] <valexey> а даже если бы и стали.. где там стандарт паскаля? много ли компиляторов его поддерживают?
[19:06:18] <valexey> подтереться ISO точно также никто не мешает
[19:06:29] <Kemet> Потому ч о они дубовые,  ам много чего нет или сделано через жопу, где то была критика
[19:06:54] <geniepro> вот насчёт исключений -- это же по сути сильно замаскированный оператор GOTO, который, к тому же, может прыгать не только внутри какой-то процедуры, но и далеко за её пределы
[19:07:17] <geniepro> в правильном языке не должно быть никаких исключений, так что даже Ада в этом плане фигова
[19:07:59] <Kemet> Совсем без исключений будет сильно плохо
[19:08:06] <geniepro> valexey: паскаль настолько устарел, что в России его даже продлевать не стали после его истечения в 2002 г., ибо он никому нинужин
[19:09:03] <geniepro> и, кстати, кроме ISO Pascal есть ещё и ISO Extended Pascal, который основан на турбо/объектном паскале
[19:09:03] <Kemet> Исключения даже в обероне есть
[19:10:11] <valexey> geniepro: дык пёс с ним с 2002 годом. вернемся в начало 90-х. где там поддержка стандардного паскаля производителями компайлеров?
[19:11:21] <geniepro> valexey: ну у них была поддержка расширенного паскаля же
[19:11:34] <valexey> полно мертвеньких ISO стандартов, хотя вещь, которую они пытались стандартизировать, нужна, важна и юзается.
[19:11:37] <valexey> просто стандарт нинужин
[19:11:41] <valexey> ISOшный
[19:11:44] <geniepro> да и если программы на стандартном паскале компилировались без проблем, то что ещё нужно?
[19:21:01] <Kemet> Хех, raii, похоже потредует объявлениеия по месту
[19:24:13] <Kemet> Ибо оно должно автоматически инициализироваться и ф нализироваться, а инициализировать все в одном месте это плохо, ибо тот же мьютекс нужен в конретном месте. Ну с мьютексом то не шибко пробле а, в крайнем случае, сделать как в модуле3, но это частность
[19:24:13] <geniepro> Kemet: вот как бы не обязательно же
[19:25:26] <geniepro> в RAII указано, что получение ресурса совпадает с его инициализациией, значит просто у нужном месте нужно вызывать NEW для этого объекта, а в этом NEW указывать какие-то параметры инициализации
[19:25:42] <geniepro> а где там объект описан -- это уже никого не волнует
[19:25:52] <Kemet> geniepro, как раз нужен какой то механизм, чтобы указать, вот в э ом месте мы иниц ализ руем. Переменная по месту как раз решает
[19:26:14] <geniepro> и без неё можно обойтись процедурой NEW
[19:27:37] <Kemet> Для записей на стеке NEW не предусмотрен
[19:28:15] <geniepro> Kemet: дык надо сделать же!
[19:30:27] <Kemet> Понимаешь, в чем ф шка таких переменных - мы ее объявили и всё, она готова, а если она в одном месте объявлена, то в другом модно и забыть  инициализацию вызывать
[19:32:25] <Kemet> В общем я темень склоняюсь к заимствованию из модулы 3 вложенных скопов
[19:33:04] <geniepro> Kemet: да ты еретик! валексей! где та картинка про "я видела ересь, которая начиналась также!"???
[19:33:34] <geniepro> Kemet: подозреваю, что это заимствование не из модулы-3, а из ады
[19:33:59] <vlad2> Объявления по месту хороши сами по себе, и без RAII. В еберероне есть ;)
[19:35:23] <Kemet> geniepro, нет, ада там ни причём
[19:36:08] <geniepro> Kemet: ну откуда ты знаешь, чем руководстововались авторы модулы-3, когда добавляли эту фичу?
[19:36:58] <Kemet> Так почитай мыллист чтарый
[19:38:25] <Kemet> vlad2, объявления по месту в стиле цэ не нужны
[19:38:41] <Kemet> Они плохи сами по себе)
[19:39:44] <vlad2> В С их и нет нормальных, есть в С++.
[19:41:18] <vlad2> Мало того, RAII можно использовать вообще без объявления переменной: f(g())
[19:41:39] <vlad2> g - может вернуть что-то с RAII
[19:42:29] <vlad2> std::unique_ptr - самое обычное дело
[19:43:25] <vlad2> finally и прочая хрень будет заведомо монструознее
[19:43:29] <geniepro> Kemet: то есть какого-то документа типа адского rationale модульщики не сделали? а ведь язык гораздо проще ады
[19:44:02] <vlad2> Правильно, что ее finally не протащили в С++ стандарт, ибо нефиг.
[19:45:35] <Kemet> geniepro, так Люка вроде всё подробностио описал про М3
[19:46:29] <geniepro> Kemet: ну скинь ссылку, трудно что ли?
[19:46:44] <Kemet> vlad2, какой то финалли внутри там все равно будет ,  наче как из освободдать если грознется ч ото
[19:47:29] <Kemet> geniepro, ну на сайте Карделли поищи
[19:51:18] <vlad2> Что-то там внутри мало кому интересно, кроме компиляторшиков. Для пользователей все предельно просто - на каждый вызвавшийся конструктор будет вызван деструктор, автоматически и в строгом обратном порядке.
[19:53:12] <vlad2> Такой подход, кстати, диктует определенную строгость при инициализации/деинициализации, что часто оказывается полезным.
[19:56:56] <vlad2> Вместо типичных макарон "убить вот этот объект, потом обнулить вот эту ссылку, потом убить еще другой объект" можно выписать так, чтобы оно все вместе умирало в соответвествии со строгой иерархией да еще и автоматически. Красота.