Блог* – Telegram
1.9K subscribers
3.46K photos
135 videos
15 files
3.69K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
use std::io::Write;
std::io::stdout().write_all(FIZZ_BUZZ_BYTES).unwrap();

Вот и всё. Если теперь открыть ассемблерный код, то среди меток будет строковая константа, которая содержит в себе весь вывод программы.

К изложенному выше можно присовокупить кое-что ещё. Внимательный читатель мог заметить, что, по большому счёту, весь итоговый результат требует подачи на вход лишь одного type-level числа, и его одного, в принципе, достаточно, чтобы получить и тип результата, и его значение. А значит, должно быть возможным написать const fn, принимающую на вход ти‌повый параметр и возвращающую итоговый массив.

Внимательный читатель прав... Принципиально. К сожалению, на текущий момент const generics в Rust весьма ограничены. Искомая функция требует написать возвращаемый тип, зависящий от константы, подсчитанной от переданного типа, что в настоящий момент невозможно на stable (это можно обойти при помощи generic-array, но давайте не будем о грустном не будем втягивать лишние зависимости). С другой стороны, в Rust есть нестабильная фича для того, чтобы включить const generics на полную: generic_const_exprs. И вот с её помощью нужную функцию написать вполне реально.

#![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.
4
It is Wednesday, my dudes.

Последняя Wednesday этого месяца.
😭17
#meme про Chrome
Forwarded from Bictor's Bizzare Shitpost (Юра Ілляшенко)
😁7👍4
Bictor's Bizzare Shitpost
Photo
А вот с лесбиянками подобное уже не прокатит
😁7👎1
#meme про... Мемы?
1
Forwarded from shitposting 3.0 [+ dragons]
Forwarded from shitposting 3.0 [+ dragons]
._.
😁44👎1
🤮4👍1
🤔14😁3🤮2❤‍🔥1
😁2🤡2🤔1🤯1
Силовики — это массовка, помноженная на акселератов
3
#prog #rust #abnormalprogramming

Тем временем nnethercote занят по настоящему важными вещами.

(а вот и сами шахматы)
🔥9🤯41
В СМЫСЛЕ УЖЕ СЕНТЯБРЬ
😱10🤣2😭2
#prog #rust #article

Learning Async Rust With Entirely Too Many Web Servers

Статья про развитие подобия web-сервера от наиболее простого однопоточного до полноценного асинхронного (в процессе — с переизобретением абстракций для асинхронности)
👍7
#prog #rust #rustlib #article

Astra: A Blocking HTTP Server Built on Top of Hyper

Astra — блокирующий HTTP-сервер поверх hyper, который делегирует переключение между тасками шедулеру операционной системы. Это позволяет использовать обычное блокирующее IO без того, чтобы тормозить асинхронный рантайм.

Можете сами посмотреть экзекутор, он там умещается в 150 строчек и достаточно прямолинейно написан.
🤨4🔥2❤‍🔥1
😒🤚 ЛЛМ
😏👉 ЛММ
7🖕1