Здравствуйте, ·, Вы писали:
R>>>А главное, зачем?? I>>Уже написали, просто добавлю. Чтобы избавится от внешних инструментов(шагов) ·>А зачем от них избавляться?
I>>Qt(moc), protobuf(protoc), odb, ну и появятся новые всякие ORM ·>Эти самые protobuf генераторы делают для всех языков, даже таких как c#/java/etc в которых и с рефлексией всё в порядке, и даже встроенная кодогенерация есть. И даже для js есть генераторы.
Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
Здравствуйте, Igore, Вы писали:
I>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется?
Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
I>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется? ·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции.
Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так?
Здравствуйте, Marty, Вы писали:
I>>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется? M>·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции. M>Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так?
Нет, в Rust есть макросы.
M>А на плюсах можно будет самому написать
А как этому поможет рефлексия? Рефлексия это доставать имена всякой всячины, классы, функции, поля. Для интерполяции нужно уметь захватывать значение локальной переменной (как в rust) или в общем случае — значение любого выражения.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[9]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
Здравствуйте, ·, Вы писали:
I>>>>Хорошо, не надо избавляться, инторполяцию строк с проверкой на уровне компилятора. Такое применение тоже не хочется? M>>·>Гы. Вот только интерполяция никак с рефлексией не связана. В Rust есть интерполяция (в некотором виде), но нет рефлексии. В Java есть рефлексия, но нет интерполяции. M>>Если я правильно понимаю, интерполяция строк там в каких-то стандартных конструкциях, так? ·>Нет, в Rust есть макросы.
Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути
M>>А на плюсах можно будет самому написать ·>А как этому поможет рефлексия? Рефлексия это доставать имена всякой всячины, классы, функции, поля. Для интерполяции нужно уметь захватывать значение локальной переменной (как в rust) или в общем случае — значение любого выражения.
Здравствуйте, Marty, Вы писали:
M>Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути
Это какое-то словоблудие. Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии. В Java есть рефлексия, но нет интерполяции."
Ты наверное путаешь рефлексию с метапрограммированием. Или показывай как через макросы в Rust напечатать имя функции, например.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
Здравствуйте, ·, Вы писали:
M>>Если через макросы можно написать интерполяцию строк, то это рефлекция, как ни крути ·>Это какое-то словоблудие.
Никакого словоблудия.
·>Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии.
Потому что рефлексия в каком-то виде есть, вероятно, сильно ограниченная. Без рефлексии (возможности программы к доступу к информации о собственной структуре) не очень представляю, как можно обратиться к локальным переменным.
·>В Java есть рефлексия, но нет интерполяции."
Если есть рефлексия, то можно написать интерполяцию. Возможно, никому просто там это не нужно
·>Ты наверное путаешь рефлексию с метапрограммированием.
Может и путаю. Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?
·>Или показывай как через макросы в Rust напечатать имя функции, например.
Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии
Здравствуйте, Marty, Вы писали:
M>·>Неясно как такое понимание согласуется с фактом: "В Rust есть интерполяция, но нет рефлексии. M>Потому что рефлексия в каком-то виде есть, вероятно, сильно ограниченная. Без рефлексии (возможности программы к доступу к информации о собственной структуре) не очень представляю, как можно обратиться к локальным переменным.
Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией.
Это в каком-то смысле сишный препроцессор, но только сделанный по-человечески. Называть сишний препроцессор рефлексией у тебя наглости не хватит, надеюсь.
M>·>В Java есть рефлексия, но нет интерполяции." M>Если есть рефлексия, то можно написать интерполяцию.
Нельзя.
M>·>Ты наверное путаешь рефлексию с метапрограммированием. M>Может и путаю.
Не сомневайся. Метапрограммирование — это очень общий термин. В плюсах то что ты назвал метапрограммированием, это ещё один частный случай: https://en.wikipedia.org/wiki/Template_metaprogramming
M>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию?
Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию.
M>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии
Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: а почему Qt-шные сигналы/слоты не вносят в стандарт C
Здравствуйте, ·, Вы писали: ·>Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией.
Зачем бы мне это?
·>Это в каком-то смысле сишный препроцессор, но только сделанный по-человечески. Называть сишний препроцессор рефлексией у тебя наглости не хватит, надеюсь.
Вот именно, что "в каком-то виде".
Рефлексия — это тоже в каком-то виде сишный препроцессор, но только сделанный по-человечески.
M>>·>В Java есть рефлексия, но нет интерполяции." M>>Если есть рефлексия, то можно написать интерполяцию. ·>Нельзя.
С фига ли? Что мешает?
M>>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию? ·>Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию.
В java есть возможность через рефлексию получить доступ к локальным переменным текущей функции/фрейма? Тогда нет проблем.
На Java я конечно ничего писать не буду, но приведу тебе другой пример. У меня есть библиотека marty::format. Там у меня есть возможность обращаться к аргументам по имени. Для этого есть специальный тип marty::format::Args — он хранит список аргументов в том порядке, в котором в него их поместили, за счёт чего можно к ним обращаться по индексу, и, дополнительно, там внутри есть ассоциативный массив, в котором хранятся связи имя->индекс, и за счёт этого и происходит обращение к аргументам по имени.
Если в плюсах появится рантайм-рефлексия, я легко переделаю этот код на код с интерполяцией, и выкину marty::format::Args. У меня разбор форматной строки делается в рантайме, потому мне нужна рантайм-рефлексия, но если бы разбор форматной строки был бы в компайл-тайм, то и интерполяция была бы времени компиляции (судя по всему, некоторые возможности компайл-тайм-рефлексии называют интроспекцией, ну окай, пусть будет интроспекция, хотя почему тогда в плюсах её называют рефлексией?).
Не вижу проблем сделать аналогичное на Java.
M>>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии ·>Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии.
Или ты
1. Есть ли в языке Rust рефлексия?
2. Что из себя представляют макросы Rust?
3. Интерполяция строк в Rust
DeepSeek говорит, что а) есть интроспекция — костыльная недо-рефлексия б) интерполяции в расте нет
Хз, может, и врёт
Здравствуйте, Marty, Вы писали:
M>·>Ну так разберись как макросы работают. И почему они называются макросами, а не рефлексией. M>Зачем бы мне это?
Ты написал "не очень представляю". Я думал ты хотел разобраться, похоже, я ошибся.
M>·>Это в каком-то смысле сишный препроцессор, но только сделанный по-человечески. Называть сишний препроцессор рефлексией у тебя наглости не хватит, надеюсь. M>Вот именно, что "в каком-то виде".
Не понял. В каком таком виде?
M>Рефлексия — это тоже в каком-то виде сишный препроцессор, но только сделанный по-человечески.
Нет. Читай доки, они рулез. Начни хоть с вики, ссылку уже давал.
M>>>Если есть рефлексия, то можно написать интерполяцию. M>·>Нельзя. M>С фига ли? Что мешает?
Отсутствие возможности.
M>>>Но ты же мне покажешь, как на плюсах при помощи метапрограммирования написать интерполяцию? M>·>Только после того, как ты мне покажешь как в java через рефлексию написать интерполяцию. M>В java есть возможность через рефлексию получить доступ к локальным переменным текущей функции/фрейма? Тогда нет проблем.
Нельзя.
M>Не вижу проблем сделать аналогичное на Java.
Это не интерполяция строк, а обычный Map<String, V>. Для этого не нужна ни рефлексия, ни доступ к локальным переменным, ни макросы, ни метапрограммирование вообще.
M>>>Я никогда не писал на раст, и конечно, ничего тебе не напишу. Даже если в расте нельзя получить имя функции, это говорит только об ограниченных возможностях рефлексии, а не о полном её отсутствии M>·>Нет, это говорит лишь о том, что ты плохо разбираешься в терминологии. M>Или ты
Нет.
M>DeepSeek говорит, что а) есть интроспекция — костыльная недо-рефлексия
Это ты врёшь. Он говорит: "не имеет рефлексии". Но в некотрых сценариях можно использовать _альтернативные_ механизмы, которые не рефлексии. Иными словами, для некоторых задач, где в какой-нибудь java можно было бы использовать рефлексию, в Rust можно воспользоваться другими механизмами для достижения похожих результатов. В качестве аналогии: если тебе надо скрепить две деревяшки шурупом, но отвёртки нет, можно заколотить молотком. Чтобы из этого сделать вывод, что молоток — это костыльная недо-отвёртка, надо иметь альтернативную одарённость.
M>б) интерполяции в расте нет M>Хз, может, и врёт
Да, врёт. Открой хоть доку:
let people = "Rustaceans";
format!("Hello {people}!"); // => "Hello Rustaceans!"
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
Здравствуйте, m2user, Вы писали:
wl.>>насколько я понимаю, в том же C# подобная функциональность это часть стандарта языка, причем очень активно использующаяся
M>А что ты там общее с C# увидел?
вот гопота отвечает:
В C# есть функционал, аналогичный Qt signal/slot — это делегаты и события (delegates и events). Они позволяют реализовать схему публикации-подписки, когда один объект может уведомлять другие о наступлении определённых событий, очень похожую на механизм сигналов и слотов в Qt.
* В C# можно подписывать несколько обработчиков на одно событие (multicast delegates), как и несколько слотов на один сигнал в Qt.
* Можно использовать стандартный EventHandler или создавать собственные делегаты с нужными параметрами.
* В отличие от Qt, синтаксис событий и делегатов встроен в язык и не требует внешней генерации кода.
Вывод:
В C# функционал событий и делегатов полностью покрывает типичные задачи signal/slot из Qt и считается стандартным способом реализации реактивного взаимодействия между объектами
Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
wl.>В C# функционал событий и делегатов полностью покрывает типичные задачи signal/slot из Qt и считается стандартным способом реализации реактивного взаимодействия между объектами
Задачи схожие. Остальное все разное.
(если бы ты дал ссылку на источник, с которого обучился AI, можно было попытаться понять мысль автора).
delegate — это аналог указателя на функцию в C++.
event — это не более, чем синтаксический сахар для хранения списка делегатов, которые будут вызваны при срабатывания event`а (последовательно в цикле в том же потоке выполнения)
Для сравнения в Java даже и этого нет: есть просто паттерн, по которому разработчик сам реализует аналогичный список, но не делегатов, а объектов, реализующих некий интерфейс с одним методом.
(и делегатов в Java тоже соотвественно нет).
Иными словами подобную тривиальную конструкцию как в C#/Java тебе ничего не мешает реализовать и в C++ без изменений в стандарте.
— Auto Connection (default) If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection. Otherwise, the behavior is the same as the Queued Connection."
— Direct Connection The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.
— Queued Connection The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
— Blocking Queued Connection The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.
Note: Using this type to connect objects in the same thread will cause deadlock.
— Unique Connection The behavior is the same as the Auto Connection, but the connection is made only if it does not duplicate an existing connection. i.e., if the same signal is already connected to the same slot for the same pair of objects, then the connection is not made and connect() returns false.
Т.е. функция-слот может вызываться как в потоке эммитера (синхронно), так и в потоке объекта-получателя (синхронно или асинхронно) в зависимости от thread affinity объекта-получателя.
В C#/Java нет таких встроенных механизмов: thread affinity объектов и автоматического вызова подписчиков на event в другом потоке.
Здравствуйте, m2user, Вы писали:
M>delegate — это аналог указателя на функцию в C++. M>event — это не более, чем синтаксический сахар для хранения списка делегатов, которые будут вызваны при срабатывания event`а (последовательно в цикле в том же потоке выполнения)
Как я понял, это не совсем так. Делегат — это список из std::function, которые будут вызваны в цикле при срабатывании event`а
Здравствуйте, m2user, Вы писали:
M>>Как я понял, это не совсем так. Делегат — это список из std::function, которые будут вызваны в цикле при срабатывании event`а
M>Нет, тип делегат в C#, это аналог type alias`а функции в C/C++.
M>C#: M>
M>delegate void CounterEvent(int newValue);
M>
M>C++: M>
M>typedef int CounterEvent(int newValue);
M>
или M>
M>using CounterEvent = int(int newValue);
M>
Ещё раз, как я понял, делегат в шарпе — это прежде всего список чего-то вызываемого. Что может быть вызываемым — это второй вопрос.
В C++ std::function предоставляет всем пользователем единый интерфейс для вызова — определенный тип возврата, и определённые аргументы в определенном количестве.
Внутри себя std::function может хранить лямбду, указатель на функцию, указатель на метод класса (и, соответственно, указатель на экземпляр класса), но он вызывает это все через единый интерфейс.
Тип возврата и аргументы, как я понимаю, должны соответствовать тому, что содержит event и что он возвращает (но тут не понятно, если обработчиков много, результат которого из них вернётся туда, где было инициированно событие?)
А то, что ты привел, это типы обработчиков события, которые могут быть присвоены делегату (а на самом деле добавлены в список вызовов)
Здравствуйте, Философ, Вы писали:
Ф>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.
Солевые наркоманы
Re[6]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
Здравствуйте, Артём, Вы писали:
Ф>>Да, это делфля. У них в язык диспатчер виндовых сообщений втроен, прямо в Object'е есть метод Dispatch(). Подробнее тут.
Аё>Солевые наркоманы
Нет, это вы наркоманы, потому что в дельфях ничего такого не было