Forwarded from Life of Tau
в чате по питону обсуждали такую задачу:
нужно написать функцию add, которая ведёт себя так:
тут используется None, хотя следовало бы создать свой sentinel или смотреть количество аргументов - вдруг кому-то придёт в голову сложить что-то с None
а потом я решила написать это на расте... встречайте:
#prog #rust #python
нужно написать функцию add, которая ведёт себя так:
>>> add(1)(2)(3)()
6
>>> add(1)(2)(3)(4)()
10
ну в принципе ничего сложного:def add(succ = None):
acc = getattr(add, "_acc", 0)
if succ is None:
if hasattr(add, "_acc"):
del add._acc
return acc
add._acc = acc + succ
return add
тут используется None, хотя следовало бы создать свой sentinel или смотреть количество аргументов - вдруг кому-то придёт в голову сложить что-то с None
а потом я решила написать это на расте... встречайте:
#![feature(fn_traits, unboxed_closures)]
use std::ops::Add;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Adder<T> {
acc: T,
}
impl<L, R, O> FnOnce<(R,)> for Adder<L>
where
L: Add<R, Output = O>,
{
type Output = Adder<O>;
extern "rust-call" fn call_once(self, (succ,): (R,)) -> Self::Output {
Adder {
acc: self.acc + succ,
}
}
}
impl<A> FnOnce<()> for Adder<A> {
type Output = A;
extern "rust-call" fn call_once(self, (): ()) -> Self::Output {
self.acc
}
}
#[allow(non_camel_case_types)]
pub struct add;
impl<A> FnOnce<(A,)> for add {
type Output = Adder<A>;
extern "rust-call" fn call_once(self, (acc,): (A,)) -> Self::Output {
Adder { acc }
}
}
fn main() {
println!("{}", add(1)(2)(3)());
}
единственное, что не получилось сделать - разрешить делать сразу add()#prog #rust #python
play.rust-lang.org
Rust Playground
A browser interface to the Rust compiler to experiment with the language
#prog #rust
Does the Bronze Garbage Collector Make Rust Easier to Use? A Controlled Experiment
Разумеется, я не мог пройти мимо статьи с подобнымеретическим громким заявлением. Авторы разработали сборщик мусора, решив при помощи stack maps от LLVM проблемы идентификации корней. Как сказано в абстракте:
> We found that for a task that required managing complex aliasing, Bronze users were more likely to complete the task in the time available, and those who did so required only about a third as much time (4 hours vs. 12 hours). We found no significant difference in total time, even though Bronze users re-did the task without Bronze afterward.
Однако меня заинтересовал сам сборщик мусора. В тексте я натолкнулся на упоминание того, что в эксперименте использовалась версия, которая фактически сборку мусора не проводила. Меня это насторожило. Я пошёл смотреть исходники и увидел issue (со ссылкой на URLO) о том, что bronze позволяет иметь две мутабельные ссылки на одно и то же значение одновременно. Что вообще-то UB. Таким образом, авторы фактически проверяли не "Rust со сборщиком мусора", а "Rust с выключенным borrow checker", что фактически ставит под сомнение результаты эксперимента. Авторы при этом ничего страшного в этом не видят. Более того, в треде отметили, что авторы скопировали часть кода из rust-gc от Manish Earth, при том,что bronze имел лицензию BSD, а rust-gc — Mozilla Public License 2.0, копилефтную лицензию.
Короче, дурная история
Does the Bronze Garbage Collector Make Rust Easier to Use? A Controlled Experiment
Разумеется, я не мог пройти мимо статьи с подобным
> We found that for a task that required managing complex aliasing, Bronze users were more likely to complete the task in the time available, and those who did so required only about a third as much time (4 hours vs. 12 hours). We found no significant difference in total time, even though Bronze users re-did the task without Bronze afterward.
Однако меня заинтересовал сам сборщик мусора. В тексте я натолкнулся на упоминание того, что в эксперименте использовалась версия, которая фактически сборку мусора не проводила. Меня это насторожило. Я пошёл смотреть исходники и увидел issue (со ссылкой на URLO) о том, что bronze позволяет иметь две мутабельные ссылки на одно и то же значение одновременно. Что вообще-то UB. Таким образом, авторы фактически проверяли не "Rust со сборщиком мусора", а "Rust с выключенным borrow checker", что фактически ставит под сомнение результаты эксперимента. Авторы при этом ничего страшного в этом не видят. Более того, в треде отметили, что авторы скопировали часть кода из rust-gc от Manish Earth, при том,что bronze имел лицензию BSD, а rust-gc — Mozilla Public License 2.0, копилефтную лицензию.
Короче, дурная история
GitHub
GitHub - mcoblenz/Bronze
Contribute to mcoblenz/Bronze development by creating an account on GitHub.
👍1
#prog #article
The Discovery of Apache ZooKeeper’s Poison Packet — статья от 2015 года об экзотическом баге, который связал воедино баги в ZooKeeper и ядре Linux. Да, серьёзно.
(thanks @oleg_log)
The Discovery of Apache ZooKeeper’s Poison Packet — статья от 2015 года об экзотическом баге, который связал воедино баги в ZooKeeper и ядре Linux. Да, серьёзно.
(thanks @oleg_log)
PagerDuty
The Discovery of Apache ZooKeeper's Poison Packet
We uncovered 4 bugs causing random cluster-wide lockups. Two bugs laid in ZooKeeper, and the other two were lurking in the Linux kernel. This is our story.
Forwarded from мне не нравится реальность
Я нашёл ICE [internal compiler error], которой можно добиться за 29 символов программы 🙂
Правда ICE чисто технически в форматтере, но всё же.
Правда ICE чисто технически в форматтере, но всё же.
macro_rules! a{()=>{A<'a,>};}
👍10👎3😁3🤩2
Forwarded from мне не нравится реальность
Когда я плакал, что не понимаю атомики (я и сейчас плачу, ахаха), мне посоветовали посмотреть несколько докладов, включая этот (в двух частях):
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part II"
Доклад очень интересный, рекомендую!!
В начале рассказывается про атомики в целом, а потом приводятся примеры того, как их можно использовать. В самом конце убийственный пример из реальной жизни, приведу цитату: «And for better performance we'll do more heap allocations».
Доклад в большей степени ориентирован на тех кто не очень хорошо знает что такое атомики, но и для тех кто знает не плохо, думаю тоже будет полезно.
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
— CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part II"
Доклад очень интересный, рекомендую!!
В начале рассказывается про атомики в целом, а потом приводятся примеры того, как их можно использовать. В самом конце убийственный пример из реальной жизни, приведу цитату: «And for better performance we'll do more heap allocations».
Доклад в большей степени ориентирован на тех кто не очень хорошо знает что такое атомики, но и для тех кто знает не плохо, думаю тоже будет полезно.
YouTube
CppCon 2014: Herb Sutter "Lock-Free Programming (or, Juggling Razor Blades), Part I"
https://www.cppcon.org
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2014
--
Example-driven talk on how to design and write lock-free algorithms and data structures using C++ atomic…
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2014
--
Example-driven talk on how to design and write lock-free algorithms and data structures using C++ atomic…
👍6
Посмотрел тут свои гисты от и до, и... Ну, неудивительно, что я Rust простым называю, я его, выходит, учу уже четыре года.
👍3😱2😢1
— Ты когда-нибудь перестанешь упоминать Rust по поводу и без?
—
—
println!("Нет");
🔥14🤮6😁4❤2👎2👍1😱1🎉1
Forwarded from Life of Tau
Twitter
Tushar Sadhwani
🐍Python news: CPython's main branch now compiles to webassembly! Thanks to @ethanhs and @ChristianHeimes Meaning: You can natively download and run Python in the browser. It's about a 5MB package right now. There's plans to make it smaller. Try it here: repl.ethanhs.me
😱7❤3🔥1