Size: a a a

2020 February 19
Блог*
Ах да, чуть не забыл: ссылка на всё это великолепие
источник
Блог*
#prog #rust

А вот тут можно взглянуть на моего соседа по палате коллегу, который пилит библиотеку для типизированных физических величин (чтобы не складывать метры с килограммами, условно говоря)
источник
Блог*
А когда я вырасту, я стану Томакой?

#typed_phy
источник
Блог*
Важный вопрос: прикручивать ли лайки?
(особенно с учётом того, что у канала вроде как есть чат)
Окончательные результаты
7%
Да
26%
Да, но только на свои посты
52%
Нет
14%
Кешбери
Проголосовало: 42
источник
Блог*
Предыдущий пин — не менее важный опрос
источник
2020 February 20
Блог*
#meme
источник
Блог*
Когда твоя программа в целом работает не так, как планировал, но свои функции выполняет
источник
Блог*
#meme
Я, конечно, понимаю, что это успело обойти все тематические каналы в телеге, но это всё-таки смешно
источник
Блог*
источник
Блог*
#article #prog

Как вы считаете середину отрезка в числах с плавающей точкой? Скорее всего, неправильно. Разбор различных методов сделать это, вместе с доказательствами на ошибки вычислений. И да, 80-битные регистры в x86 опять всё портят.

https://hal.archives-ouvertes.fr/file/index/docid/576641/filename/computing-midpoint.pdf
источник
2020 February 21
Блог*
#prog #rust #моё

Хозяйке на заметку

Иногда бывает ситуация, что у вас на руках есть некое значение, про которое известно, что его тип реализует определённый трейт, и вам нужно вызвать метод этого трейта, но есть небольшая проблема: метод не принимает Self (как, например, Default::default), а воспользоваться синтаксисом турборыбы нельзя, потому что тип не имеет имени, которое можно написать (скажем, если вы получили это значение из функции, возвращающей impl Trait). Как же поступить в подобном случае? Сделать метод на значении самому!

Для определённости сделаем подобный трейт и напишем для него реализацию:

trait WithTypeMethod {
   fn method(arg: i32);
}

impl WithTypeMethod for () {
   fn method(arg: i32) {
       println!("Called `<() as WithTypeMethod>::method` with arg = {}", arg)
   }
}


И напишем функцию, для результата вызова которой мы не можем использовать турборыбу:

fn make_it() -> impl WithTypeMethod + Default {
   ()
}


Для того, чтобы решить нашу задачу, сделаем для WithTypeMethod extension trait с методом, принимающим &self, который просто вызывает Type::method с нужным аргументом:

trait LowerToInstance: WithTypeMethod {
   fn instance_method(&self, arg: i32);
}

impl<T: WithTypeMethod> LowerToInstance for T {
   fn instance_method(&self, arg: i32) {
       T::method(arg)
   }
}


Теперь воспользуемся этим:

let it = make_it();
LowerToInstance::instance_method(&it, 42);


Использование fully qualified синтаксиса для вызова метода тут критично: так мы удостоверяемся, что мы действительно вызываем метод для нужного типа, а не для, скажем, ссылки на этот тип. Из-за deref coercion следующий код тоже работает:

let it = make_it();
(&&&&&&&it).instance_method(18);
источник
2020 February 22
Блог*
dereference_pointer_there
Можем ли мы теперь объявить торжество zero-cost абстракций? К сожалению, нет: форматировщик, использующий Ymd, заставляет вызывать Date::as_ymd даже в том случае, если используется только одно из значений месяц или день — а переход на Ymd был совершён именно по соображениям производительности! У меня есть идеи, как можно решить этот недостаток, но... Это потребует несколько более тяжёлой ти́повой наркомании, так что это материал для следующей статьи.
Мне уже даже про Томаку шутить не хочется
источник
Блог*
dereference_pointer_there
Мне уже даже про Томаку шутить не хочется
#prog #rust #моё

Самое смешное, что это в итоге так и не работает.

В текущем виде каждый форматировщик имеет имеет три ассоциированных типа (Year, Month и Day), которые описывают, нужна ли этому форматировщику эта часть даты или нет — фактически, этими типами могут быть только Reqired и Optional. Главный метод для форматирования принимает на вход сам форматировщик, буфер и некий обобщённый провайдер, про который известно только то, что он даёт доступ к полям, нужным для форматировщика. В типах это выражается тем, что это обобщённый тип, удовлетворяющий трейту Satisfies<Self::Year, Self::Month, Self::Day>. Второй метод принимает на вход форматировщик, буфер и дату и имеют реализацию по умолчанию, которая создаёт провайдер данных из даты (именно в этот момент применяется оптимизация с вызовом month_day вместо month и day по отдельности) и вызывает на форматировщике первый метод.

Вся эта машинерия создавалась с расчётом на то, что из нескольких форматировщиков можно составить один. В этом случае провайдер создаётся лишь один раз и передаётся субформатировщикам, а требования к провайдеру являются объединением требований субформатировщиков. Именно с последним пунктом у меня возникли проблемы: rustc не понимал, что если провайдер удовлетворяет объединённым, более сильным условиям, то он автоматически удовлетворяет и более слабым требованиям субформатировщиков. Сейчас я понимаю, что мой метод объединения требований непрозрачный для компилятора и не сохраняет эту информацию. В общем, буду думать.

А, ну и, как вы можете видеть, даже если я решу эту задачу, решение, скорее всего, будет слишком сложным для применения на практике. В принципе, это не такая уж и большая потеря: обычно из даты форматируют все три главные компоненты, а в этом случае мой предыдущий метод не даёт дополнительного оверхеда.
источник
2020 February 23
Блог*
Переслано от Vlad Beskrovnyy
Очень извиняюсь за дикий оффтоп. Моего друга Александра Литреева задержали в Екатеринбурге. Вы очень поможете, если у вас есть квартира под сдачу в Екатеринбурге и вы можете оформить договор до 7 утра 24 февраля. Или у кого-то из ваших знакомых. Или если вы можете кинуть это в другие чаты. Если до 7 утра не найдем, то отъедет в СИЗО почти наверняка.

Если у вас есть варианты, пишите в личку мне или его адвокату @ArkChaplygin, пожалуйста.
Еще раз извиняюсь за оффтоп, запиню предыдущий пин обратно завтра
https://zona.media/news/2020/02/23/litreev
источник
Блог*
dereference_pointer_there
Переслано от Vlad Beskrovnyy
Очень извиняюсь за дикий оффтоп. Моего друга Александра Литреева задержали в Екатеринбурге. Вы очень поможете, если у вас есть квартира под сдачу в Екатеринбурге и вы можете оформить договор до 7 утра 24 февраля. Или у кого-то из ваших знакомых. Или если вы можете кинуть это в другие чаты. Если до 7 утра не найдем, то отъедет в СИЗО почти наверняка.

Если у вас есть варианты, пишите в личку мне или его адвокату @ArkChaplygin, пожалуйста.
Еще раз извиняюсь за оффтоп, запиню предыдущий пин обратно завтра
https://zona.media/news/2020/02/23/litreev
Немного контекста: https://zona.media/news/2020/02/23/litreev
источник
2020 February 25
Блог*
Переслано от Антон ⚙️
Народ, приведите, пожалуйста, ситуации, когда вам нужно было в Rust вернуть замыкание, но этого не получалось сделать прямолинейно из-за того, что каждое замыкание имеет свой тип (и приходилось боксить/оборачивать в Either/что-то ещё)
источник
Блог*
dereference_pointer_there
Переслано от Антон ⚙️
Народ, приведите, пожалуйста, ситуации, когда вам нужно было в Rust вернуть замыкание, но этого не получалось сделать прямолинейно из-за того, что каждое замыкание имеет свой тип (и приходилось боксить/оборачивать в Either/что-то ещё)
Пишите в личку или в @decltype_chat_ptr_t
источник
Блог*
dereference_pointer_there
Уже 150 подписчиков! 🎉 Хорошая скорость, однако
Уже 200! Прекрасно! 🎉 Спасибо, что читаете мой блог!
источник
Блог*
dereference_pointer_there
Уже 200! Прекрасно! 🎉 Спасибо, что читаете мой блог!
источник
2020 February 26
Блог*
#prog #article #gamedev

Статья о том, как портировали на консоли игру, первоначально написанную на JavaScript. Спойлер: динамичность мешается.

habr.com/ru/post/489974/
источник