

diffstatic — инструмент для определения разницы между исходниками, который понимает синтаксис и потому отображает более адекватный дифф (см. пример).
(thanks @rustawesome)
Size: a a a
feature(min_const_generics)
.feature(const_generics_defaults)
✨feature(generic_const_exprs)
забагованнаяfeature(min_generic_const_exprs)
//рекурсивная функция, использующая системный стек⬇️
fn triangular(n: u64) -> u64 {
if n == 0 {
0
} else {
n + triangular(n - 1)
}
}
//использует стек на кучеАвтор этой статьи столкнулся со случаем, когда ему потребовалось переделывать рекурсивное решение на итеративное из-за переполнения стека, и ему не понравилось, что он руками делает то, что вполне мог бы сделать компьютер автоматически. Немного подумав, он смог разработать решение, которое бы использовало генераторы (пока что всё ещё только на nightly) и которое требовало бы для работы достаточно прямолинейную трансформацию, чтобы её можно было сделать процедурными макросами.
fn triangular_safe(n: u64) -> u64 {
trampoline(|n| move |_| {
if n == 0 {
0
} else {
n + yield (n - 1)
}
})(n)
}