Информация об изменениях

Сообщение Re: Кому компил-тайма отсыпать? от 27.04.2025 6:49

Изменено 27.04.2025 9:04 rg45

Re: Кому компил-тайма отсыпать?
Здравствуйте, Shmj, Вы писали:

S>Вот вам парсер-калькулятор строк в компил-тайме, все как вы любите:


Продолжаешь демонстрировать непонимание. Путаешь цели и средства.

S>И вопрос — как такое отлаживать по шагам?


Нет, первый вопрос не этот. Первый вопрос — какие задачи решает данный инструмент. И если на этот вопрос имеется ответ, то второй вопрос отправляется отдыхать, как дурацкий. Как отладить и покрыть тестами тот или иной инструмент, всегда можно найти способы. Поэлементно, как же ещё.

А если на первый вопрос ответа нет, тогда тем более второй вопрос отпадает. То есть, ты задал ещё один дурацкий вопрос, так получается.

P.S. Ну и вообще, во всём в этом примере чувствуется дрожащая рука чайника. Накрутили-намудрили.

Во-первых, calc_v тоже следовало бы защитить констрейнтом:

template<auto Lit>
requires ValidExpr<Lit>
using calc_v = std::integral_constant<unsigned long long, calc<Lit>::value>;


Чтобы при ошибках пользователя компилер тыкал своим толстым пальцем в ошибки пользователя, а не в "плохой" calc_v. Чтоб не в "потроха", как любит говорить Слонёнок, на которого мы не будем показывать пальцами.

Во-вторых, с литералом перемудрили — использовали нестандартное расширение, чем сделали необоснованно жёсткую привязку к компайл-тайму и накрыли медным тазом портабельность. Не нашли другого способа, как задать компайл-тайм строку, блин. Я думаю, можно было тупо std::string заюзать, при нормально заточенных руках и сделать этот парсер применимым как в компайл-, так и в ран-тайме:

https://coliru.stacked-crooked.com/a/2a403be350ebf997

static_assert(std::string("Hello World!").size() == 12);
static_assert(std::string("Hello World!")[0] == 'H');
static_assert(std::string("Hello World!")[6] == 'W');
static_assert(std::string("Hello World!")[11] == '!');

// "Моковая" реализация calc,
// демонстрирующая возмость работы с объектами std::string в компайл-тайм.
constexpr auto calc(const std::string& s) {return s.size() * 1000;} 

static_assert(calc("80 * 100") == 8000);


И тогда любой Шмж мог бы проитись по этому коду с дорогим его сердцу интегрированным отладчиком.

И расширямость оставляет желать лучшего. Копипаста, опять же.

Склоняюсь к мысли, что "компайл-тайм" в данном случае был самоцелью. Чтоб показать коллегам по работе, мол "зырьте, чё могу". То есть, какой-то чайник чё-то наговнокодил, а ты нам это предъявляешь, как-будто это наш собственный код.

Тебе кажется, что если тебе попался какой-то код с шаблонами, который тебе трудно понять, то это повод пойти на РСДН и что-то предъявить? Нет, дорогой, профессионализм — это способность делать сложные вещи просто, а не простые сложно.
Re: Кому компил-тайма отсыпать?
Здравствуйте, Shmj, Вы писали:

S>Вот вам парсер-калькулятор строк в компил-тайме, все как вы любите:


Продолжаешь демонстрировать непонимание. Путаешь цели и средства.

S>И вопрос — как такое отлаживать по шагам?


Нет, первый вопрос не этот. Первый вопрос — какие задачи решает данный инструмент. И если на этот вопрос имеется ответ, то второй вопрос отправляется отдыхать, как дурацкий. Как отладить и покрыть тестами тот или иной инструмент, всегда можно найти способы. Поэлементно, как же ещё.

А если на первый вопрос ответа нет, тогда тем более второй вопрос отпадает. То есть, ты задал ещё один дурацкий вопрос, так получается.

P.S. Ну и вообще, во всём в этом примере чувствуется дрожащая рука чайника. Накрутили-намудрили.

Во-первых, calc_v тоже следовало бы защитить констрейнтом:

template<auto Lit>
requires ValidExpr<Lit>
using calc_v = std::integral_constant<unsigned long long, calc<Lit>::value>;


Чтобы при ошибках пользователя компилер тыкал своим толстым пальцем в ошибки пользователя, а не в "плохой" calc_v. Чтоб не в "потроха", как любит говорить Слонёнок, на которого мы не будем показывать пальцами.

Во-вторых, с литералом перемудрили — использовали нестандартное расширение, чем сделали необоснованно жёсткую привязку к компайл-тайму и накрыли медным тазом портабельность. Не нашли другого способа, как задать компайл-тайм строку, блин. Я думаю, можно было тупо std::string заюзать, при нормально заточенных руках и сделать этот парсер применимым как в компайл-, так и в ран-тайме:

https://coliru.stacked-crooked.com/a/2a403be350ebf997

static_assert(std::string("Hello World!").size() == 12);
static_assert(std::string("Hello World!")[0] == 'H');
static_assert(std::string("Hello World!")[6] == 'W');
static_assert(std::string("Hello World!")[11] == '!');

// "Моковая" реализация calc,
// демонстрирующая возмость работы с объектами std::string в компайл-тайм.
constexpr auto calc(const std::string& s) {return s.size() * 1000;} 

static_assert(calc("80 * 100") == 8000);


И тогда любой Шмж мог бы проитись по этому коду с дорогим его сердцу интегрированным отладчиком.

И расширямость этого инструмента оставляет желать лучшего. Копипаста, опять же.

Склоняюсь к мысли, что "компайл-тайм" в данном случае был самоцелью. Чтоб показать коллегам по работе, мол "зырьте, чё могу". То есть, какой-то чайник чё-то наговнокодил, а ты нам это предъявляешь, как-будто это наш собственный код.

Тебе кажется, что если тебе попался какой-то код с шаблонами, который тебе трудно понять, то это повод пойти на РСДН и что-то предъявить? Нет, дорогой, профессионализм — это способность делать сложные вещи просто, а не простые сложно.