A Brief History of Rust
Hey, there's a local Rust meetup
in the Triangle area!
Check them out!
meetup.com/triangle-rustaceans/
A Brief History of Rust
circa 2006: Rough inception
2009: Tentative Mozilla involvement
2010: Public Mozilla commitment
2011: Compiler self-hosts, Servo begins
2012: First public release
2014: First beta release
2015: First stable release
Timeline
2006-2009
~foo(lit,er,als) {
... a-random-string ...
}
User-defined literals
2006-2009
try {
...
} trap foo(x) {
fix x + 10;
} trap bar(y) {
log "got a bar";
fail;
}
Exceptions
2006-2009
if (... ) {
x = foo();
} else {
// "uh oh"
x = raise foo(gurgle);
}
Exceptions
2006-2009
fn f(int x, int y) -> () { ... }
type thunk1 = fn f(int x) -> ();
type thunk0 = fn f() -> ();
let thunk1 t1 = bind f(10,_);
let thunk1 t2 = bind f(_,10);
let thunk0 t0 = bind f(10,12);
No closures, only currying
2006-2009
// what
for (~auto e = v.(,)) {
out <| e <| endl;
}
Iterators and printing
2006-2009
Language runtime
"Hmm. I am generally not interested in multithreading: it's not worth the pain. There are reasons you might want it, but they're few."
2006-2009
Tuples
"NO DAMN TUPLES" [...] "NO WAIT, WE NEED TUPLES"
2006-2009
References
"Can you alias a non-copyable? Hmm. There is very little point! You would not be able to copy an alias-of-a-non-copyable and, as it's an alias, you would not be able to move (modify) it either."
2006-2009
type mt = mod {
type e;
fn mk()->e;
fn eat(e)->nil;
}
let mt mv = mod {
type e = int;
fn mk()->e { ret 1; }
fn eat(int i) { }
}
use mt mm = mv;
let mm.e me = mm.mk();
mm.eat(me);
First-class modules
2006-2009
let set[int] s1 = listSet[int];
let set[int] s2 = treeSet[int];
let set[int] s3 = mod set[int] {
type t = []; ...
}
Square brackets
2006-2009
Typestate
"Every program containing symbolic expressions maps to a sequence of statements in a 3-operand-statement normal form with call-by-value-return move-semantics on slots and bindings. Every "point" (inbetween normalized statements) in a program has a typestate. Two typestates are therefore defined for each statement: its prestate and its poststate. A typestate is formally a set of N-ary boolean predicates over visible slots. Typestates form a semilattice ordered by subset-inclusion (x < y means x is a subset of y), where 'join' means 'set intersection'. When N statements lead to a single point, the point's typestate is the pairwise join of the N poststates of preCeding statements."
2011
category name(T) {
fn foo(params) -> ret {
/* self has type &T */
}
priv fn bar(params) -> ret {
/* self has type &T */
}
}
"Categories"
2011
struct T<...> {
member1: T1;
mutable member2: T2;
priv member3: T3;
}
"Categories"
2011
iface animal {
fn speak();
fn play();
};
Interfaces
2012
class monster {
let mut health: int;
let name: str;
new(health: int, name: str) {
self.health = health;
self.name = name;
}
}
Classes
2012
use std;
fn main(args: [str]) {
std::io::println("hello from '"
+ args[0]
+ "', world!");
}
Hello World
2012
#warn("only %d seconds remaining", 10);
#error("fatal: %s", get_err_string());
Macros
2012
fn call_twice(f: block()) { f(); f(); }
call_twice({|| "I am a block"; });
call_twice(fn@() { "Boxed closure"; });
fn bare_function() { "Plain function"; }
call_twice(bare_function);
Closures
2012
alt mypoint {
{x: 0f, y: y_name} { /* Sub-pattern */ }
{x, y} { /* Bind */ }
}
Matching
2012
let x = @10; // New box, refcount of 1
let y = x; // Copy pointer, bump refcount
Garbage-collected data
2012
let x = ~10;
let y <- x;
Owned data
A Brief History of Rust
By bstrie
A Brief History of Rust
- 5,604