Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 27.04.25 03:13
Оценка: 27 (3) +1
Вот вам парсер-калькулятор строк в компил-тайме, все как вы любите:

// compile_time_calc.hpp — reference implementation of the constexpr calculator
// C++20/23, single-header.  Drop it into a project and `#include`.

#ifndef COMPILE_TIME_CALC_HPP
#define COMPILE_TIME_CALC_HPP

#include <string_view>
#include <optional>
#include <limits>
#include <cstddef>
#include <type_traits>

//---------------------------------------------------------------------
// 1.  NTTP-строка как тип
//---------------------------------------------------------------------

template<char... Cs>
struct lit {
    static constexpr char str[sizeof...(Cs) + 1]{ Cs..., '\0' };
};

// пользовательский литерал       "42*(3+1)"_expr  →  объект типа lit<'4','2','*', ...>

template<typename CharT, CharT... Cs>
consteval auto operator"" _expr() {
    static_assert(std::is_same_v<CharT, char>, "_expr supports only narrow char literals");
    return lit<Cs...>{};
}

//---------------------------------------------------------------------
// 2.  Проверка переполнения для пяти базовых операций
//---------------------------------------------------------------------

constexpr unsigned long long MAX = std::numeric_limits<unsigned long long>::max();

constexpr std::optional<unsigned long long> add(unsigned long long a, unsigned long long b) {
    return (a > MAX - b) ? std::nullopt : std::optional{ a + b };
}
constexpr std::optional<unsigned long long> sub(unsigned long long a, unsigned long long b) {
    return (a < b) ? std::nullopt : std::optional{ a - b };
}
constexpr std::optional<unsigned long long> mul(unsigned long long a, unsigned long long b) {
    return (b != 0 && a > MAX / b) ? std::nullopt : std::optional{ a * b };
}
constexpr std::optional<unsigned long long> div(unsigned long long a, unsigned long long b) {
    return (b == 0) ? std::nullopt : std::optional{ a / b };
}
constexpr std::optional<unsigned long long> mod(unsigned long long a, unsigned long long b) {
    return (b == 0) ? std::nullopt : std::optional{ a % b };
}

//---------------------------------------------------------------------
// 3.  Рекурсивный парсер-оценщик
//---------------------------------------------------------------------

struct parser {
    std::string_view s;
    std::size_t pos = 0;

    constexpr bool eof() const { return pos >= s.size(); }
    constexpr char peek() const { return eof() ? '\0' : s[pos]; }
    constexpr void skip_ws() {
        while (!eof() && (peek() == ' ' || peek() == '\t' || peek() == '\n')) ++pos;
    }
    constexpr bool consume(char c) {
        skip_ws();
        if (peek() == c) { ++pos; return true; }
        return false;
    }

    // number := [0-9]+
    constexpr std::optional<unsigned long long> number() {
        skip_ws();
        if (peek() < '0' || peek() > '9') return std::nullopt;
        unsigned long long v = 0;
        while (!eof() && peek() >= '0' && peek() <= '9') {
            int digit = peek() - '0';
            if (auto nv = mul(v, 10)) {
                if (auto nv2 = add(*nv, digit)) {
                    v = *nv2;
                } else return std::nullopt;
            } else return std::nullopt;
            ++pos;
        }
        return v;
    }

    // factor := number | '(' expr ')'
    constexpr std::optional<unsigned long long> factor() {
        skip_ws();
        if (consume('(')) {
            auto val = expr();
            if (!val || !consume(')')) return std::nullopt;
            return val;
        }
        return number();
    }

    // term := factor { ('*' | '/' | '%') factor }
    constexpr std::optional<unsigned long long> term() {
        auto lhs = factor();
        if (!lhs) return std::nullopt;
        while (true) {
            skip_ws();
            char op = peek();
            if (op != '*' && op != '/' && op != '%') break;
            ++pos;
            auto rhs = factor();
            if (!rhs) return std::nullopt;
            switch (op) {
            case '*': lhs = mul(*lhs, *rhs); break;
            case '/': lhs = div(*lhs, *rhs); break;
            case '%': lhs = mod(*lhs, *rhs); break;
            }
            if (!lhs) return std::nullopt;
        }
        return lhs;
    }

    // expr := term { ('+' | '-') term }
    constexpr std::optional<unsigned long long> expr() {
        auto lhs = term();
        if (!lhs) return std::nullopt;
        while (true) {
            skip_ws();
            char op = peek();
            if (op != '+' && op != '-') break;
            ++pos;
            auto rhs = term();
            if (!rhs) return std::nullopt;
            switch (op) {
            case '+': lhs = add(*lhs, *rhs); break;
            case '-': lhs = sub(*lhs, *rhs); break;
            }
            if (!lhs) return std::nullopt;
        }
        return lhs;
    }
};

//---------------------------------------------------------------------
// 4.  Вспомогательный meta-проход: lit<Cs...> → optional<ULL>
//---------------------------------------------------------------------

template<char... Cs>
consteval std::optional<unsigned long long> eval_impl() {
    constexpr std::string_view sv{ lit<Cs...>::str, sizeof...(Cs) }; // без NUL
    parser p{ sv };
    auto val = p.expr();
    p.skip_ws();
    return (!val || !p.eof()) ? std::nullopt : val;
}

// превращаем объект lit<...> в мета-информацию

template<typename T>
struct parsed;                       // общая шаблонная декларация

template<char... Cs>
struct parsed<lit<Cs...>> {
    static constexpr auto opt = eval_impl<Cs...>();
    static constexpr bool ok  = opt.has_value();
    static constexpr unsigned long long value = *opt; // ОК использовать, только если ok == true
};

//---------------------------------------------------------------------
// 5.  Концепты и основной шаблон calc
//---------------------------------------------------------------------

template<auto Lit>
concept ValidExpr = parsed<decltype(Lit)>::ok;

template<auto Lit>
requires ValidExpr<Lit>
struct calc {
    static constexpr unsigned long long value = parsed<decltype(Lit)>::value;
    constexpr operator unsigned long long() const { return value; }
};

//---------------------------------------------------------------------
// 6.  Утилита-alias для SFINAE-френдли value-типа
//---------------------------------------------------------------------

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


#endif // COMPILE_TIME_CALC_HPP


int main(int argc, const char * argv[]) {
    static_assert(calc<"42 * (10 - 8)"_expr>::value == 84);
    static_assert(ValidExpr<"((7+5)*3)"_expr>);
}




И вопрос — как такое отлаживать по шагам?
=сначала спроси у GPT=
Отредактировано 27.04.2025 4:05 Shmj . Предыдущая версия .
Re: Кому компил-тайма отсыпать?
От: Doom100500 Израиль  
Дата: 27.04.25 06:15
Оценка: +1 :)
Здравствуйте, Shmj, Вы писали:

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

  skip
S>
S>// compile_time_calc.hpp — reference implementation of the constexpr calculator
S>// C++20/23, single-header.  Drop it into a project and `#include`.

S>#ifndef COMPILE_TIME_CALC_HPP
S>#define COMPILE_TIME_CALC_HPP

S>#include <string_view>
S>#include <optional>
S>#include <limits>
S>#include <cstddef>
S>#include <type_traits>

S>//---------------------------------------------------------------------
S>// 1.  NTTP-строка как тип
S>//---------------------------------------------------------------------

S>template<char... Cs>
S>struct lit {
S>    static constexpr char str[sizeof...(Cs) + 1]{ Cs..., '\0' };
S>};

S>// пользовательский литерал       "42*(3+1)"_expr  →  объект типа lit<'4','2','*', ...>

S>template<typename CharT, CharT... Cs>
S>consteval auto operator"" _expr() {
S>    static_assert(std::is_same_v<CharT, char>, "_expr supports only narrow char literals");
S>    return lit<Cs...>{};
S>}

S>//---------------------------------------------------------------------
S>// 2.  Проверка переполнения для пяти базовых операций
S>//---------------------------------------------------------------------

S>constexpr unsigned long long MAX = std::numeric_limits<unsigned long long>::max();

S>constexpr std::optional<unsigned long long> add(unsigned long long a, unsigned long long b) {
S>    return (a > MAX - b) ? std::nullopt : std::optional{ a + b };
S>}
S>constexpr std::optional<unsigned long long> sub(unsigned long long a, unsigned long long b) {
S>    return (a < b) ? std::nullopt : std::optional{ a - b };
S>}
S>constexpr std::optional<unsigned long long> mul(unsigned long long a, unsigned long long b) {
S>    return (b != 0 && a > MAX / b) ? std::nullopt : std::optional{ a * b };
S>}
S>constexpr std::optional<unsigned long long> div(unsigned long long a, unsigned long long b) {
S>    return (b == 0) ? std::nullopt : std::optional{ a / b };
S>}
S>constexpr std::optional<unsigned long long> mod(unsigned long long a, unsigned long long b) {
S>    return (b == 0) ? std::nullopt : std::optional{ a % b };
S>}

S>//---------------------------------------------------------------------
S>// 3.  Рекурсивный парсер-оценщик
S>//---------------------------------------------------------------------

S>struct parser {
S>    std::string_view s;
S>    std::size_t pos = 0;

S>    constexpr bool eof() const { return pos >= s.size(); }
S>    constexpr char peek() const { return eof() ? '\0' : s[pos]; }
S>    constexpr void skip_ws() {
S>        while (!eof() && (peek() == ' ' || peek() == '\t' || peek() == '\n')) ++pos;
S>    }
S>    constexpr bool consume(char c) {
S>        skip_ws();
S>        if (peek() == c) { ++pos; return true; }
S>        return false;
S>    }

S>    // number := [0-9]+
S>    constexpr std::optional<unsigned long long> number() {
S>        skip_ws();
S>        if (peek() < '0' || peek() > '9') return std::nullopt;
S>        unsigned long long v = 0;
S>        while (!eof() && peek() >= '0' && peek() <= '9') {
S>            int digit = peek() - '0';
S>            if (auto nv = mul(v, 10)) {
S>                if (auto nv2 = add(*nv, digit)) {
S>                    v = *nv2;
S>                } else return std::nullopt;
S>            } else return std::nullopt;
S>            ++pos;
S>        }
S>        return v;
S>    }

S>    // factor := number | '(' expr ')'
S>    constexpr std::optional<unsigned long long> factor() {
S>        skip_ws();
S>        if (consume('(')) {
S>            auto val = expr();
S>            if (!val || !consume(')')) return std::nullopt;
S>            return val;
S>        }
S>        return number();
S>    }

S>    // term := factor { ('*' | '/' | '%') factor }
S>    constexpr std::optional<unsigned long long> term() {
S>        auto lhs = factor();
S>        if (!lhs) return std::nullopt;
S>        while (true) {
S>            skip_ws();
S>            char op = peek();
S>            if (op != '*' && op != '/' && op != '%') break;
S>            ++pos;
S>            auto rhs = factor();
S>            if (!rhs) return std::nullopt;
S>            switch (op) {
S>            case '*': lhs = mul(*lhs, *rhs); break;
S>            case '/': lhs = div(*lhs, *rhs); break;
S>            case '%': lhs = mod(*lhs, *rhs); break;
S>            }
S>            if (!lhs) return std::nullopt;
S>        }
S>        return lhs;
S>    }

S>    // expr := term { ('+' | '-') term }
S>    constexpr std::optional<unsigned long long> expr() {
S>        auto lhs = term();
S>        if (!lhs) return std::nullopt;
S>        while (true) {
S>            skip_ws();
S>            char op = peek();
S>            if (op != '+' && op != '-') break;
S>            ++pos;
S>            auto rhs = term();
S>            if (!rhs) return std::nullopt;
S>            switch (op) {
S>            case '+': lhs = add(*lhs, *rhs); break;
S>            case '-': lhs = sub(*lhs, *rhs); break;
S>            }
S>            if (!lhs) return std::nullopt;
S>        }
S>        return lhs;
S>    }
S>};

S>//---------------------------------------------------------------------
S>// 4.  Вспомогательный meta-проход: lit<Cs...> → optional<ULL>
S>//---------------------------------------------------------------------

S>template<char... Cs>
S>consteval std::optional<unsigned long long> eval_impl() {
S>    constexpr std::string_view sv{ lit<Cs...>::str, sizeof...(Cs) }; // без NUL
S>    parser p{ sv };
S>    auto val = p.expr();
S>    p.skip_ws();
S>    return (!val || !p.eof()) ? std::nullopt : val;
S>}

S>// превращаем объект lit<...> в мета-информацию

S>template<typename T>
S>struct parsed;                       // общая шаблонная декларация

S>template<char... Cs>
S>struct parsed<lit<Cs...>> {
S>    static constexpr auto opt = eval_impl<Cs...>();
S>    static constexpr bool ok  = opt.has_value();
S>    static constexpr unsigned long long value = *opt; // ОК использовать, только если ok == true
S>};

S>//---------------------------------------------------------------------
S>// 5.  Концепты и основной шаблон calc
S>//---------------------------------------------------------------------

S>template<auto Lit>
S>concept ValidExpr = parsed<decltype(Lit)>::ok;

S>template<auto Lit>
S>requires ValidExpr<Lit>
S>struct calc {
S>    static constexpr unsigned long long value = parsed<decltype(Lit)>::value;
S>    constexpr operator unsigned long long() const { return value; }
S>};

S>//---------------------------------------------------------------------
S>// 6.  Утилита-alias для SFINAE-френдли value-типа
S>//---------------------------------------------------------------------

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


S>#endif // COMPILE_TIME_CALC_HPP


S>int main(int argc, const char * argv[]) {
S>    static_assert(calc<"42 * (10 - 8)"_expr>::value == 84);
S>    static_assert(ValidExpr<"((7+5)*3)"_expr>);
S>}

S>


S>int main(int argc, const char * argv[]) {

S> static_assert(calc<"42 * (10 — 8)"_expr>::value == 84);
S> static_assert(ValidExpr<"((7+5)*3)"_expr>);
S>}


Нихрена не понял, зачем всё это? Разве так не компайл таим?

int main(int argc, const char * argv[]) {
    static_assert(42 * (10 - 8)) == 84);

 //а это вообще в компиляторе по умолчанию проверится.
    // static_assert(ValidExpr<"((7+5)*3)"_expr>);
}


S>


Спасибо за внимание
Re[2]: Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 27.04.25 06:25
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>Нихрена не понял, зачем всё это? Разве так не компайл таим?


Так то ж из строки — можете добавить свои кастомные операторы, к примеру. Возможно даже свой Python закодить.
=сначала спроси у GPT=
Re: Кому компил-тайма отсыпать?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 27.04.25 06:25
Оценка: +1 :))
Здравствуйте, Shmj, Вы писали:

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


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


Также, как я ядро Линукса, например. Тот, кто такое может написать, тот и отладить сможет. А кто не может, тому надо сначала научиться писать, а потом уже отлаживать.
Re: Кому компил-тайма отсыпать?
От: rg45 СССР  
Дата: 27.04.25 06:49
Оценка: 3 (2) +1
Здравствуйте, Shmj, Вы писали:

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


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

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);


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

В-третьих, расширямость и декомпозиция задач в реализации этого инструмента оставляет желать лучшего. Копипаста там и сям. Взгляни, например, на term и expr — они же совпадают чуть ли не полностью. Не хватило мозгов (или желания) отделить специфику и приоритеты операций от общего парсинга. Я уже молчу про AST, построение которого, по-хорошему, следовало бы отделить от вычислений.

Тебе кажется, что если тебе попался какой-то код с шаблонами, который тебе трудно понять, то это повод пойти на РСДН и что-то предъявить? Нет, дорогой, профессионализм — это способность делать сложные вещи просто, а не простые сложно.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 27.04.2025 10:22 rg45 . Предыдущая версия . Еще …
Отредактировано 27.04.2025 10:18 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 10:15 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 10:09 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 10:06 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 10:03 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:38 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:36 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:33 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:31 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:24 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:13 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:07 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:04 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 9:01 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:59 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:40 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:37 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:35 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:33 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:31 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:29 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:22 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:19 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:18 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:13 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:11 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:08 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:07 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:04 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 8:00 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:59 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:56 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:56 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:55 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:53 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:44 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:42 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:39 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:24 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:17 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:14 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:13 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:13 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:06 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:05 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 7:04 rg45 . Предыдущая версия .
Отредактировано 27.04.2025 6:54 rg45 . Предыдущая версия .
Re[3]: Кому компил-тайма отсыпать?
От: Doom100500 Израиль  
Дата: 27.04.25 07:18
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Doom100500, Вы писали:


D>>Нихрена не понял, зачем всё это? Разве так не компайл таим?


S>Так то ж из строки — можете добавить свои кастомные операторы, к примеру. Возможно даже свой Python закодить.


Это ж из compile-time строки. Т.е. строки — прямо написанной в коде. Не прочитанной из конфига, не полученное по апи. Захардоженнная строка.
Зачем в compile-time разгребать строки с арифметическими выражениями, если можно, вместо строки, тожно также захардкодить выражение.
Смысл этого только академический — такой-же, как и в compile-time факториале. Для того, чтобы сказать: "смотрите как я умею"
Спасибо за внимание
Re[2]: Кому компил-тайма отсыпать?
От: sergii.p  
Дата: 28.04.25 09:46
Оценка:
Здравствуйте, rg45, Вы писали:

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


это больно похоже на ChatGPT. И относится к этому надо так же. Сейчас любой Шимжа (не в обиду будь сказано) сможет наваять такой код, но не сможет его отлаживать Ну может это и не надо. Тут задача не такая сложная, тут ИИ вполне может довести до финального решения.
Re[3]: Кому компил-тайма отсыпать?
От: flаt  
Дата: 28.04.25 10:20
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>это больно похоже на ChatGPT. И относится к этому надо так же. Сейчас любой Шимжа (не в обиду будь сказано) сможет наваять такой код, но не сможет его отлаживать


Я уж было подумал, что он сам его написал. Если б сам — то респект, ибо наконец-то освоил ЯП на должном уровне, и не важно, что нет практического применения данному коду или что он не идеален — уже за одно только развитие в освоении языка можно похвалить.

Если не сам написал — то зачем сюда это принёс? Чтобы спросить, как это отлаживать? Ну так и надо было тему озаглавить, а то сейчас выглядит будто "я что-то написал и могу поделиться этим со всеми — вот только я не знаю, как это работает и как это отлаживать"
Re[4]: Кому компил-тайма отсыпать?
От: McQwerty Россия  
Дата: 28.04.25 12:43
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>>>Нихрена не понял, зачем всё это? Разве так не компайл таим?

S>>Так то ж из строки — можете добавить свои кастомные операторы, к примеру. Возможно даже свой Python закодить.

D>Это ж из compile-time строки. Т.е. строки — прямо написанной в коде. Не прочитанной из конфига, не полученное по апи. Захардоженнная строка.

D>Зачем в compile-time разгребать строки с арифметическими выражениями, если можно, вместо строки, тожно также захардкодить выражение.
D>Смысл этого только академический — такой-же, как и в compile-time факториале. Для того, чтобы сказать: "смотрите как я умею"

Подъедет "#embed" — можно будет разбирать то, что во внешнем ресурсе содержится.
Re[4]: Кому компил-тайма отсыпать?
От: rg45 СССР  
Дата: 28.04.25 14:42
Оценка:
Здравствуйте, flаt, Вы писали:

F>Если не сам написал — то зачем сюда это принёс? Чтобы спросить, как это отлаживать? Ну так и надо было тему озаглавить, а то сейчас выглядит будто "я что-то написал и могу поделиться этим со всеми — вот только я не знаю, как это работает и как это отлаживать"


Ну, о его мотивации можно догадаться по первому же предложению: "все как вы любите". Он пришёл с очередным риторическим вопросом. Мол, видите, отлаживаться невозможно, значит, говно этот ваш компайл-тайм, шаблоны говно и С++ тоже.
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Кому компил-тайма отсыпать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.04.25 14:54
Оценка:
Здравствуйте, McQwerty, Вы писали:

D>>Это ж из compile-time строки. Т.е. строки — прямо написанной в коде. Не прочитанной из конфига, не полученное по апи. Захардоженнная строка.

D>>Зачем в compile-time разгребать строки с арифметическими выражениями, если можно, вместо строки, тожно также захардкодить выражение.
D>>Смысл этого только академический — такой-же, как и в compile-time факториале. Для того, чтобы сказать: "смотрите как я умею"

MQ>Подъедет "#embed" — можно будет разбирать то, что во внешнем ресурсе содержится.


В каком внешнем ресурсе?
Маньяк Робокряк колесит по городу
Re[6]: Кому компил-тайма отсыпать?
От: McQwerty Россия  
Дата: 29.04.25 15:14
Оценка: +1
Здравствуйте, Marty, Вы писали:

MQ>>Подъедет "#embed" — можно будет разбирать то, что во внешнем ресурсе содержится.

M>В каком внешнем ресурсе?

Практически в любом. Предлагается, что это будет определяться реализацией. Захотят — могут и URLы разрешить:
#embed "https://rsdn.org/account/info/2511"


Или, если смотреть исходный посыл топика:
int main(int argc, const char * argv[]) {
    static_assert(ValidExpr<"
#embed "формула"
    "_expr>);
}
Re[5]: Кому компил-тайма отсыпать?
От: sergii.p  
Дата: 30.04.25 08:02
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>Подъедет "#embed" — можно будет разбирать то, что во внешнем ресурсе содержится.


в принципе и сейчас можно. xxd -i в сmake и
const char* data[] = {
    #include "prepared.inc"
};

Головняк конечно. Но зато не надо ждать C++23.
Re[5]: Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 30.04.25 12:46
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну, о его мотивации можно догадаться по первому же предложению: "все как вы любите". Он пришёл с очередным риторическим вопросом. Мол, видите, отлаживаться невозможно, значит, говно этот ваш компайл-тайм, шаблоны говно и С++ тоже.


Вообще C++ возможен и без неудобоваримых компил-таймовых конструкций. И тогда он довольно не плох. Основной плюс — можно написать код и использовать на всех 6-ти платформах из всех ЯП без заморочек + на всех архитектурах. И это 100% работает — я так делал.

А вот можно ли на других языках — на том же C# — ну покажите мне библитоеку, которая достигла такого уровня. Не верю. Чтобы реально компилилась под все платформы и ее использовали — не была от 50 МБ размером — не верю.

На Rust вроде можно, но тоже не факт что все гладко. Да и сам Rust как язык — ничем не лучше.
=сначала спроси у GPT=
Re[6]: Кому компил-тайма отсыпать?
От: Muxa  
Дата: 30.04.25 16:32
Оценка:
S>Вообще C++ возможен и без неудобоваримых компил-таймовых конструкций.

А их обязательно использовать или по желанию?
Re[6]: Кому компил-тайма отсыпать?
От: rg45 СССР  
Дата: 30.04.25 16:40
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вообще C++ возможен и без неудобоваримых компил-таймовых конструкций. И тогда он довольно не плох.


Кому интересны твои субъективные оценки. Ты же С++ оцениваешь примерно так же, как беззубая старушка оценивает орешки.

Ты дорасти сперва, хотя бы до уровня джуна, потом рассказывай, что плохо, что хорошо.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 30.04.2025 16:53 rg45 . Предыдущая версия . Еще …
Отредактировано 30.04.2025 16:51 rg45 . Предыдущая версия .
Отредактировано 30.04.2025 16:42 rg45 . Предыдущая версия .
Re[7]: Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 30.04.25 21:57
Оценка:
Здравствуйте, Muxa, Вы писали:

S>>Вообще C++ возможен и без неудобоваримых компил-таймовых конструкций.

M>А их обязательно использовать или по желанию?

По желанию. Причем многие уже не актуальны в связи с введением упрощающих конструкций в новых версиях.
=сначала спроси у GPT=
Re[7]: Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 30.04.25 21:57
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ты дорасти сперва, хотя бы до уровня джуна, потом рассказывай, что плохо, что хорошо.


Ваши оценки — основаны на личности и авторитете. Я же призываю вас смотреть не кто говорит — а что говорит.
=сначала спроси у GPT=
Re[8]: Кому компил-тайма отсыпать?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 30.04.25 22:45
Оценка: +1
Здравствуйте, Shmj, Вы писали:

R>>Ты дорасти сперва, хотя бы до уровня джуна, потом рассказывай, что плохо, что хорошо.


S>Ваши оценки — основаны на личности и авторитете. Я же призываю вас смотреть не кто говорит — а что говорит.


Так мы и смотрим не на то, кто ты, а на то, что ты несёшь. А несёшь ты дичь
Маньяк Робокряк колесит по городу
Re[9]: Кому компил-тайма отсыпать?
От: Shmj Ниоткуда  
Дата: 30.04.25 22:50
Оценка:
Здравствуйте, Marty, Вы писали:

S>>Ваши оценки — основаны на личности и авторитете. Я же призываю вас смотреть не кто говорит — а что говорит.

M>Так мы и смотрим не на то, кто ты, а на то, что ты несёшь. А несёшь ты дичь

Вообще вопрос личности поднимать не нужно — говори по сути. По сути что хотел сказать? В чем дичь?

Ты доказал что являешься гомо и умеешь встраиваться в соц. иерархию (п. 3 по Савельеву — соц. доминирование). А теперь докажи что ты сапиенс: https://rsdn.org/forum/design/8928077.1
Автор: Shmj
Дата: 30.04.25
=сначала спроси у GPT=
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.