Признали, что стажёр обязан выплатить 13к белорусских рублей (почти 400к ₽). Аппеояцию подавать не стал, так как каждый раз ему бы приходилось платить нос пошлину в размере 500 белорусских рублей
С рантаймом вариант только явно указывать захватываемые переменные
Захват - это по суди передача по ссылке, при чем такая же явная. А интересно, может быть можно брать эти ссылки не передачей, а используя новый синтаксис. Понятно, что в рантайме этот адрес будет разный, но в компайлтайме кажется, что можно было бы указать, что этот адрес нужно получить
Это бы еще убрало бы одну из потребностей макросов, когда те используют переменную из контекста, которая в них явно не передается. Т.е. функция сама решает, какую переменную нужно передавать в нее
Рефлексия работает на времени компиляции, так что компилятор учтет, что используется ссылка, и либо соптимизирует внутри функции тоже, либо не будет оптимизировать
Оптимизация не является частью языка, и, если в языке есть переменная с именем a, то ее можно было бы брать из рефлексии, даже если она соптимизированна
Кстати, если такой способ получения ссылок на переменные из вызываемой функции возможны, то с помощью перерузки строкового литерала (operator ""_f), можно сделать такие же f-строки. (только будет не префикс, а суффикс _f) И без узкоспециализированного синтаксиса только для формата. Чем и крут C++
Хотя, без синтаксической поддержки сложные выражения не подставишь, или нужен будет какой-то constexpr eval, что уже очень странно для c++. Не знаю, нужны ли вообще f-строки в этом языке, это другой вопрос. Мне интересно, можно ли вот так взять произвольную ссылку по имени на переменную из вызывающей функции
Можно ли, используя эту рефлексию, реализовать примерно такое?
int a = 5;
print("a = {a}");
Чтобы функция вытащила строку между фигурными скобками, и использовала как переданную переменную a? Или как ссылку на локальную переменную из функции, из которой вызывают.
Это было бы достаточно жестко, если бы функция через рефлексию могла получить доступ к контексту, из которого ее вызывают. Как-то так:
template for (auto var : meta::calledFrom().variables())
{
if (var.name == "a"){
std::cout << [: var.getConstReference() :];
break;
}
}
Где бы вместо "a" мы взяли бы подстроку из фигурных скобок в "a = {a}". Это было бы очень мощно!
При чем тут практика? - тред про сложность! Вы переключаете тему и предьявляете, что никто ничего не понимает. Все прекрасно понимают, чем отличается сложность и быстрость, вы кого за дураков держите?
Тред про то, что один человек написал O(log(n)), а второй не понял, по какому основанию, я пояснил, что оно не имеет значение в данной записи
В конце рабочего дня мой начальник задумчиво говорит: „Было бы неплохо выделить шкаф под книги. Только поставить его некуда“. Я, недолго думая, предлагаю ему поставить этот шкаф у меня в кабинете, так как, как раз вчера у меня был демонтирован один лишний стол. Ответ начальника меня ошарашил: „Доверить тебе мои книги? Нет уж, я поставлю шкаф у себя“.
Может быть он не воровства боялся, а что вы в них загляните. Может быть там что-то очень личное, что даже название не хотел бы вам показывать? А то нереалистично, если он боялся воровства, то это странно
На этапе компиляции невозможно проконтроллировать то, что программист передает в функцию число, не находящееся в массиве. Пример с массивом не самый подходящий, но логика компилятора в том, что он оптимизирует исходя из того, что состояние UB исключено из языка
Предполагается, что программист учел, что в эту функцию будут подаваться только числа, содержащиеся в массиве. Варнинги кидать точно не нужно, так как может быть программист так и задумал, и делает проверку перед передачей аргумента в функцию. Конкретно этот пример не очевидный, но логика компилятора такая
Вообще по описанию похоже, будто автоматически определяется, что возвращаемые значение функции (или часть из них) были проигнорированны, и java сама может выпилить вычисление этих значений, без побочных эффектов. Звучит круто - это какая-то серьезная эвристика. Неужели в джаве такое есть? Было бы интересно
Кроме того, как минимум, по моему опыту, Java (в большинстве окружений) просто лучше распознает, какие фрагменты кода выполнять не обязательно, а какие критичны для функционирования программы.
Не понял, а что значит "какие фрагменты кода выполнять не обязательно"? Как это?
О(n^2/2-n/2) = О(n^2), и это следует из определения. Я точно не помню, но своими словами O(f(n)) означает, что найдутся такие k1 и k2, что k1*f(n) < f(n) < k2*f(n). Сама f(n) между двумя функциями может изгибаться как угодно
но мне обычно важно на практике, что код не перебирает лишние цифры.
Ассимптотическая сложность алгоритма не имеет к этому никакого отношения. Коэфиценты k1 и k2 могут быть сколь угодно большими или маленькими
Если хотите посчитать число операций, зачем вам вообще тогда нужно O? Просто считайте: n^2/2-n/2, а O(n^2/2-n/2) показывает полное непонимание того, что вы делаете
Признали, что стажёр обязан выплатить 13к белорусских рублей (почти 400к ₽). Аппеояцию подавать не стал, так как каждый раз ему бы приходилось платить нос пошлину в размере 500 белорусских рублей
Вы не добавили хабы C, C++
Ммм, пожалуй вы правы. Спасибо
Ну как,
std::cout
на compile time не получится ;)Захват - это по суди передача по ссылке, при чем такая же явная. А интересно, может быть можно брать эти ссылки не передачей, а используя новый синтаксис. Понятно, что в рантайме этот адрес будет разный, но в компайлтайме кажется, что можно было бы указать, что этот адрес нужно получить
Это бы еще убрало бы одну из потребностей макросов, когда те используют переменную из контекста, которая в них явно не передается. Т.е. функция сама решает, какую переменную нужно передавать в нее
Рефлексия работает на времени компиляции, так что компилятор учтет, что используется ссылка, и либо соптимизирует внутри функции тоже, либо не будет оптимизировать
Оптимизация не является частью языка, и, если в языке есть переменная с именем a, то ее можно было бы брать из рефлексии, даже если она соптимизированна
Кстати, если такой способ получения ссылок на переменные из вызываемой функции возможны, то с помощью перерузки строкового литерала (
operator ""_f
), можно сделать такие же f-строки. (только будет не префикс, а суффикс_f
) И без узкоспециализированного синтаксиса только для формата. Чем и крут C++Хотя, без синтаксической поддержки сложные выражения не подставишь, или нужен будет какой-то constexpr eval, что уже очень странно для c++. Не знаю, нужны ли вообще f-строки в этом языке, это другой вопрос. Мне интересно, можно ли вот так взять произвольную ссылку по имени на переменную из вызывающей функции
f строки это то да, этим и навеянно. Просто мне стало интересно, возможно ли такое сделать этой ревлексией без специальных языковых конструкций
Можно ли, используя эту рефлексию, реализовать примерно такое?
Чтобы функция вытащила строку между фигурными скобками, и использовала как переданную переменную a? Или как ссылку на локальную переменную из функции, из которой вызывают.
Это было бы достаточно жестко, если бы функция через рефлексию могла получить доступ к контексту, из которого ее вызывают. Как-то так:
Где бы вместо "a" мы взяли бы подстроку из фигурных скобок в "a = {a}". Это было бы очень мощно!
Клавиши Home, End, PgUp, PgDn находятся не как на ноутбучых клавиатурах на стрелочках, а в каком-то отдельном неудобном блоке
При чем тут практика? - тред про сложность! Вы переключаете тему и предьявляете, что никто ничего не понимает. Все прекрасно понимают, чем отличается сложность и быстрость, вы кого за дураков держите?
Тред про то, что один человек написал O(log(n)), а второй не понял, по какому основанию, я пояснил, что оно не имеет значение в данной записи
Может быть он не воровства боялся, а что вы в них загляните. Может быть там что-то очень личное, что даже название не хотел бы вам показывать? А то нереалистично, если он боялся воровства, то это странно
Основание не имеет значение для сложности, так как любое основание можно привести к другому, домножив на константу. log_c(x) = log_n(x)/log_n(c)
Да не переживайте, вообще пофиг кто что считает. Главное, чтобы вам нравилось
На этапе компиляции невозможно проконтроллировать то, что программист передает в функцию число, не находящееся в массиве. Пример с массивом не самый подходящий, но логика компилятора в том, что он оптимизирует исходя из того, что состояние UB исключено из языка
Предполагается, что программист учел, что в эту функцию будут подаваться только числа, содержащиеся в массиве. Варнинги кидать точно не нужно, так как может быть программист так и задумал, и делает проверку перед передачей аргумента в функцию. Конкретно этот пример не очевидный, но логика компилятора такая
Планируется ли добавить такую штуку в vscode?
Вообще по описанию похоже, будто автоматически определяется, что возвращаемые значение функции (или часть из них) были проигнорированны, и java сама может выпилить вычисление этих значений, без побочных эффектов. Звучит круто - это какая-то серьезная эвристика. Неужели в джаве такое есть? Было бы интересно
Я тоже подумал, но это странно. Этот код не "не обезательно" выполняется, он вообще не выполняется
Не понял, а что значит "какие фрагменты кода выполнять не обязательно"? Как это?
О(n^2/2-n/2) = О(n^2), и это следует из определения. Я точно не помню, но своими словами O(f(n)) означает, что найдутся такие k1 и k2, что k1*f(n) < f(n) < k2*f(n). Сама f(n) между двумя функциями может изгибаться как угодно
Ассимптотическая сложность алгоритма не имеет к этому никакого отношения. Коэфиценты k1 и k2 могут быть сколь угодно большими или маленькими
Если хотите посчитать число операций, зачем вам вообще тогда нужно O? Просто считайте: n^2/2-n/2, а O(n^2/2-n/2) показывает полное непонимание того, что вы делаете