Continued sketching out code for checking states against preconditions.

It's still sketchy. I added a typestate annotation field to statements
tagged stmt_decl or stmt_expr, because a stmt_decl statement has a typestate
that's different from that of its child node. This necessitated trivial
changes to a bunch of other files all over to the compiler. I also added a
few small standard library functions, some of which I didn't actually end
up using but which I thought might be useful anyway.
This commit is contained in:
Tim Chevalier 2011-04-06 17:56:44 -07:00
parent 36d75d6391
commit 2e90bd94de
16 changed files with 362 additions and 151 deletions

View file

@ -1,5 +1,6 @@
import option.none;
import option.some;
import util.orb;
type vbuf = rustrt.vbuf;
@ -230,6 +231,26 @@ fn foldl[T, U](fn (&U, &T) -> U p, &U z, &vec[T] v) -> U {
}
}
fn unzip[T, U](&vec[tup(T, U)] v) -> tup(vec[T], vec[U]) {
auto sz = len[tup(T, U)](v);
if (sz == 0u) {
ret tup(alloc[T](0u), alloc[U](0u));
}
else {
auto rest = slice[tup(T, U)](v, 1u, sz);
auto tl = unzip[T, U](rest);
auto a = vec(v.(0)._0);
auto b = vec(v.(0)._1);
ret tup(a + tl._0, b + tl._1);
}
}
fn or(&vec[bool] v) -> bool {
auto f = orb;
be _vec.foldl[bool, bool](f, false, v);
}
// Local Variables:
// mode: rust;
// fill-column: 78;

View file

@ -135,6 +135,28 @@ impure fn set(&t v, uint i, bool x) {
}
}
/* true if all bits are 1 */
fn is_true(&t v) -> bool {
for(uint i in v.storage) {
if (i != 1u) {
ret false;
}
}
ret true;
}
/* true if all bits are non-1 */
fn is_false(&t v) -> bool {
for(uint i in v.storage) {
if (i == 1u) {
ret false;
}
}
ret true;
}
fn init_to_vec(t v, uint i) -> uint {
if (get(v, i)) {
ret 1u;

View file

@ -38,6 +38,13 @@ fn is_none[T](&t[T] opt) -> bool {
}
}
fn from_maybe[T](&T def, &t[T] opt) -> T {
alt(opt) {
case (none[T]) { ret def; }
case (some[T](?t)) { ret t; }
}
}
// Local Variables:
// mode: rust;
// fill-column: 78;

View file

@ -11,6 +11,18 @@ fn rational_leq(&rational x, &rational y) -> bool {
ret x.num * y.den <= y.num * x.den;
}
fn fst[T, U](&tup(T, U) x) -> T {
ret x._0;
}
fn snd[T, U](&tup(T, U) x) -> U {
ret x._1;
}
fn orb(&bool a, &bool b) -> bool {
ret a || b;
}
// Local Variables:
// mode: rust;
// fill-column: 78;