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

Сообщение Re[10]: Что умеет C++ времени компиляции? от 23.07.2023 9:33

Изменено 23.07.2023 9:34 Alekzander

Re[10]: Что умеет C++ времени компиляции?
Здравствуйте, FR, Вы писали:

FR>Из относительно массовых только rust наверно, там есть полноценные процедурные макросы, правда гораздо менее удобные чем в немерле, так как из коробки работают только с токенами, но есть библиотеки который их поднимают до уровня квазицитирования. С файловой системой, и даже с сетью, эти макросы отлично могут работать Разработчик показал, как получить SSH-ключ с помощью compile-time макроса в Rust в VSCode просто при открытии приложения


Большое спасибо за ответ. А можно я попрошу прямо здесь показать, на что они годятся? На двух актуальных примерах, обсуждавшихся на этих форумах в последнее время.

Первый это is in set
Автор: Alekzander
Дата: 17.06.23
. Как записать вот такой код:

void adns__querysend_tcp(adns_query qu, struct timeval now) {
  ...
  if (!(errno == EAGAIN || EWOULDBLOCK || // Sic!
        errno == EINTR || errno == ENOSPC ||
        errno == ENOBUFS || errno == ENOMEM)) {
  ...
}


Вот в таком виде, не потеряв в производительности?

if (!(errno is in (
                       EAGAIN,
                       EWOULDBLOCK,
                       EINTR,
                       ENOSPC,
                       ENOBUFS,
                       ENOMEM
                   ))
{
...
}


(Я понимаю, что дизайнер языков из меня так себе и синтаксис "is in", возможно, не лучшее решение, и если это ещё выразительнее можно записать, то я не против ).

Второй пример
Автор: netch80
Дата: 16.07.23
(нужен тип, который бы не давал выйти за диапазоны уже в момент присваивания):

template <int _T_min, int _T_max>
RangedInteger& operator=(int new_value) {
  if (new_value < _T_min || new_value > _T_max) { throw range_error(); }
  mValue = new_value;
  return *this;
}


На самом-то деле, шаблон тут довольно уместен. Может быть даже, это самое выразительное решение при объявлении переменной. Но, допустим, в духе идеи того обсуждения, нам захотелось изобразить псевдовстроенный тип с ограничениями и каким-нибудь выразительным синтаксисом наподобие (более удачные вариации приветствуются):

a: int 1..100


Можно ли это сделать на rust и как? Много хорошего про него слышу, но так и не удосужился попробовать самому. Буду благодарен за примеры, чтобы понять, стоит ли изучать.

A>>А если этот ЯП в итоге транспилируется в C++ (как сами плюсы изначально транспилировались в си), то я даже знаю, где применить


FR>Тут разве что nim, там есть макросы близкие к процедурным и шаблоны уровня C++, еще возможно haxe но не помню как там с макросами. Оба умеют транслироваться в си, а nim и в с++.


Ещё раз спасибо, читаю документацию.
Re[10]: Что умеет C++ времени компиляции?
Здравствуйте, FR, Вы писали:

FR>Из относительно массовых только rust наверно, там есть полноценные процедурные макросы, правда гораздо менее удобные чем в немерле, так как из коробки работают только с токенами, но есть библиотеки который их поднимают до уровня квазицитирования. С файловой системой, и даже с сетью, эти макросы отлично могут работать Разработчик показал, как получить SSH-ключ с помощью compile-time макроса в Rust в VSCode просто при открытии приложения


Большое спасибо за ответ. А можно я попрошу прямо здесь показать, на что они годятся? На двух актуальных примерах, обсуждавшихся на этих форумах в последнее время.

Первый это is in set
Автор: Alekzander
Дата: 17.06.23
. Как записать вот такой код:

void adns__querysend_tcp(adns_query qu, struct timeval now) {
  ...
  if (!(errno == EAGAIN || EWOULDBLOCK || // Sic!
        errno == EINTR || errno == ENOSPC ||
        errno == ENOBUFS || errno == ENOMEM)) {
  ...
}


Вот в таком виде, не потеряв в производительности?

if (!(errno is in (
                       EAGAIN,
                       EWOULDBLOCK,
                       EINTR,
                       ENOSPC,
                       ENOBUFS,
                       ENOMEM
                   ))
{
...
}


(Я понимаю, что дизайнер языков из меня так себе и синтаксис "is in", возможно, не лучшее решение, и если это ещё выразительнее можно записать, то я не против ).

Второй пример
Автор: netch80
Дата: 16.07.23
(нужен тип, который бы не давал выйти за диапазоны уже в момент присваивания):

template <int _T_min, int _T_max>
RangedInteger& operator=(int new_value) {
  if (new_value < _T_min || new_value > _T_max) { throw range_error(); }
  mValue = new_value;
  return *this;
}


На самом-то деле, шаблон тут довольно уместен. Может быть даже, это самое выразительное решение при объявлении переменной. Но, допустим в духе идеи того обсуждения, нам захотелось изобразить псевдовстроенный тип с ограничениями и каким-нибудь выразительным синтаксисом наподобие (более удачные вариации приветствуются):

a: int 1..100


Можно ли это сделать на rust и как? Много хорошего про него слышу, но так и не удосужился попробовать самому. Буду благодарен за примеры, чтобы понять, стоит ли изучать.

A>>А если этот ЯП в итоге транспилируется в C++ (как сами плюсы изначально транспилировались в си), то я даже знаю, где применить


FR>Тут разве что nim, там есть макросы близкие к процедурным и шаблоны уровня C++, еще возможно haxe но не помню как там с макросами. Оба умеют транслироваться в си, а nim и в с++.


Ещё раз спасибо, читаю документацию.