use std::io::Write;
std::io::stdout().write_all(FIZZ_BUZZ_BYTES).unwrap();
Вот и всё. Если теперь открыть ассемблерный код, то среди меток будет строковая константа, которая содержит в себе весь вывод программы.К изложенному выше можно присовокупить кое-что ещё. Внимательный читатель мог заметить, что, по большому счёту, весь итоговый результат требует подачи на вход лишь одного type-level числа, и его одного, в принципе, достаточно, чтобы получить и тип результата, и его значение. А значит, должно быть возможным написать const fn, принимающую на вход типовый параметр и возвращающую итоговый массив.
Внимательный читатель прав... Принципиально. К сожалению, на текущий момент const generics в Rust весьма ограничены. Искомая функция требует написать возвращаемый тип, зависящий от константы, подсчитанной от переданного типа, что в настоящий момент невозможно на stable (это можно обойти при помощи generic-array, но давайте
#![feature(generic_const_exprs)]
#![allow(incomplete_features))] // да, я в курсе, что она не готова
const fn to_buf<N>() -> ([u8; FizzBuzzList::<N>::LEN], usize)
where
N: RangeDownFrom,
MakeRangeDownFrom<N>: ReverseWith<Nil>,
RangeTo<N>: EnumerateFromWithCycle<Z, Three>,
EnumerateFromZeroWithCycle3<RangeTo<N>>: EnumerateFromWithCycle<Z, Five>,
FizzBuzzEnumerate<RangeTo<N>>: TailOf,
Tail<FizzBuzzEnumerate<RangeTo<N>>>: ToFizzBuzz,
FizzBuzzList<N>: WriteLen + WriteBuf<{ FizzBuzzList::<N>::LEN }>,
{
<FizzBuzzList::<N> as WriteBuf<{ FizzBuzzList::<N>::LEN }>>::BUF
}
Эту функцию я написал без ошибок с первого раза путём вдумчивого написания кода... Нет, конечно. Я поступил так, как поступил бы любой нормальный Rust-программист: написал функцию с телом и заголовком, а потом добавлял where clauses, о которых услужливо сообщал компилятор. Итоговый результат выглядит устрашающе, но, поверьте, без типовых алиасов это выглядело ещё хуже.К сожалению, для того, чтобы эта функция компилировалась, нам нужно подправить определение
Three и Five — без них компилятор не поймёт, что EnumerateFromWithCycle<Z, Three> и EnumerateFromWithCycle<Z, S<S<S<Z>>>> — это одно и то же:type Three = S<S<S<Z>>>;
type Five = S<S<S<S<S<Z>>>>>;
Обратите внимание, числа заданы напрямую, а не через операцию суммирования. Это и есть тот самый баг, который я упоминал.Что ж, весь код, как всегда, в гисте. Обратите внимание, в этот раз, помимо кода, там есть ещё и Cargo.toml. В него включены две фичи, которые можно легко менять через
cargo run/cargo build. Фича use_nightly меняет определение FIZZ_BUZZ_BYTES на использующую ночную фичу функцию to_buf выше. Фича compare_with_previous_impl активирует предыдущую реализацию compile-time Fizzbuzz, а также ассерт, который проверяет, что результаты, полученные разными методами, одинаковы. Фичи можно активировать независимо друг от друга, но use_nightly, разумеется, требует +nigthly.GitHub
Tracking Issue for complex generic constants: `feature(generic_const_exprs)` · Issue #76560 · rust-lang/rust
This is a tracking issue for complex generic expressions in constants which is still highly experimental. The feature gate for the issue is #![feature(generic_const_exprs)]. On stable all const gen...
❤4
Блог*
use std::io::Write; std::io::stdout().write_all(FIZZ_BUZZ_BYTES).unwrap(); Вот и всё. Если теперь открыть ассемблерный код, то среди меток будет строковая константа, которая содержит в себе весь вывод программы. К изложенному выше можно присовокупить кое…
Кусочек ассемблерного листинга, подтверждающий сказанное выше
#prog #rust #abnormalprogramming
Тем временем nnethercote занят по настоящему важными вещами.
(а вот и сами шахматы)
Тем временем nnethercote занят по настоящему важными вещами.
(а вот и сами шахматы)
🔥9🤯4❤1
#prog #rust #article
How to speed up the Rust compiler in August 2023
Очередная пачка изменений для ускорения компилятора
How to speed up the Rust compiler in August 2023
Очередная пачка изменений для ускорения компилятора
Nicholas Nethercote
How to speed up the Rust compiler in August 2023
It has been five months since my last general update on the Rust compiler’s performance. Let’s see what has happened in that time.
#prog #rust #article
Learning Async Rust With Entirely Too Many Web Servers
Статья про развитие подобия web-сервера от наиболее простого однопоточного до полноценного асинхронного (в процессе — с переизобретением абстракций для асинхронности)
Learning Async Rust With Entirely Too Many Web Servers
Статья про развитие подобия web-сервера от наиболее простого однопоточного до полноценного асинхронного (в процессе — с переизобретением абстракций для асинхронности)
Ibraheem Ahmed
Learning Async Rust With Entirely Too Many Web Servers
Async Rust is a whole new world of programming. Let's try to understand it by working our way through a series of web servers, learning the details of concurrency and I/O along the way.
👍7
#prog #rust #rustlib #article
Astra: A Blocking HTTP Server Built on Top of Hyper
Astra — блокирующий HTTP-сервер поверх hyper, который делегирует переключение между тасками шедулеру операционной системы. Это позволяет использовать обычное блокирующее IO без того, чтобы тормозить асинхронный рантайм.
Можете сами посмотреть экзекутор, он там умещается в 150 строчек и достаточно прямолинейно написан.
Astra: A Blocking HTTP Server Built on Top of Hyper
Astra — блокирующий HTTP-сервер поверх hyper, который делегирует переключение между тасками шедулеру операционной системы. Это позволяет использовать обычное блокирующее IO без того, чтобы тормозить асинхронный рантайм.
Можете сами посмотреть экзекутор, он там умещается в 150 строчек и достаточно прямолинейно написан.
Ibraheem Ahmed
Astra: A Blocking HTTP Server Built on Top of Hyper
Announcing Astra, a blocking HTTP server built on top of Hyper.
🤨4🔥2❤🔥1