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:
parent
36d75d6391
commit
2e90bd94de
16 changed files with 362 additions and 151 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue