When
Description
An arm of a Match, in one of two forms (selected by argument count):
When(T)– static: runs iff no earlier arm matched and the
subject’s static type is T; binds it to the value.
When(N, T)– variant: runs iff no earlier arm matched and the
subject’s runtime tag is Variant(N, ...)’s T; binds it to the T-typed payload.
Success
Body runs at most once, only on a match, with it bound.
Failure
Macro cannot fail. Usable only inside a Match. When(N, T) for a T the variant cannot hold is a compile error (no as_T member).
Usage example (Cross-references)
Usage examples (Cross-references)
- In
Variant.c:21:
bool hit = false;
Match(n) {
When(Number, int) hit = (it == 42);
When(Number, double) hit = false;
}- In
Variant.c:22:
Match(n) {
When(Number, int) hit = (it == 42);
When(Number, double) hit = false;
}- In
Variant.c:28:
bool hd = false;
Match(m) {
When(Number, int) hd = false;
When(Number, double) hd = (it == 2.5);
}- In
Variant.c:29:
Match(m) {
When(Number, int) hd = false;
When(Number, double) hd = (it == 2.5);
}
return hit && hd;- In
Variant.c:40:
double bd = 0.0;
Match(a) {
When(Number, int) ai = it * 2; // it : int
When(Number, double) bd = it;
}- In
Variant.c:41:
Match(a) {
When(Number, int) ai = it * 2; // it : int
When(Number, double) bd = it;
}
Match(b) {- In
Variant.c:44:
}
Match(b) {
When(Number, int) ai = it;
When(Number, double) bd = it * 2.0; // it : double
}- In
Variant.c:45:
Match(b) {
When(Number, int) ai = it;
When(Number, double) bd = it * 2.0; // it : double
}
return ai == 20 && bd == 3.0;- In
Variant.c:53:
static Number twice(Number n) {
Match(n) {
When(Number, int) return Number_from_int(it * 2);
When(Number, double) return Number_from_double(it * 2.0);
}- In
Variant.c:54:
Match(n) {
When(Number, int) return Number_from_int(it * 2);
When(Number, double) return Number_from_double(it * 2.0);
}
return n;- In
Variant.c:63:
bool ok = false;
Match(r) {
When(Number, int) ok = (it == 42);
When(Number, double) ok = false;
}- In
Variant.c:64:
Match(r) {
When(Number, int) ok = (it == 42);
When(Number, double) ok = false;
}
return ok;- In
Variant.c:73:
// Match directly on a function-return rvalue; float-less Number -> Otherwise unused.
Match(twice(Number_from_double(1.5))) {
When(Number, int) ok = false;
When(Number, double) ok = (it == 3.0);
Otherwise ok = false;- In
Variant.c:74:
Match(twice(Number_from_double(1.5))) {
When(Number, int) ok = false;
When(Number, double) ok = (it == 3.0);
Otherwise ok = false;
}- In
Variant.c:84:
bool ok = false;
Match(c) {
When(Cell, int) ok = false;
When(Cell, char) ok = (it == 'Z');
}- In
Variant.c:85:
Match(c) {
When(Cell, int) ok = false;
When(Cell, char) ok = (it == 'Z');
}
return ok;- In
Variant.c:96:
for (int k = 0; k < 3; k++) {
Match(vals[k]) {
When(Tri, int) ok = ok && (it == 7), seen |= 1;
When(Tri, float) ok = ok && (it == 1.5f), seen |= 2;
When(Tri, char) ok = ok && (it == 'A'), seen |= 4;- In
Variant.c:97:
Match(vals[k]) {
When(Tri, int) ok = ok && (it == 7), seen |= 1;
When(Tri, float) ok = ok && (it == 1.5f), seen |= 2;
When(Tri, char) ok = ok && (it == 'A'), seen |= 4;
}- In
Variant.c:98:
When(Tri, int) ok = ok && (it == 7), seen |= 1;
When(Tri, float) ok = ok && (it == 1.5f), seen |= 2;
When(Tri, char) ok = ok && (it == 'A'), seen |= 4;
}
}- In
Variant.c:108:
int count = 0;
Match(n) {
When(Number, int) count++;
When(Number, double) count++;
Otherwise count++;- In
Variant.c:109:
Match(n) {
When(Number, int) count++;
When(Number, double) count++;
Otherwise count++;
}- In
Variant.c:122:
Number n = Number_from_double(9.0); // holds double, only int handled, no Otherwise
Match(n) {
When(Number, int)(void) it;
}
return true; // unreachable -- the match aborts first
- In
TypeMatch.c:22:
int tag = -1;
Match(i) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;- In
TypeMatch.c:23:
Match(i) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;
}- In
TypeMatch.c:29:
Match(d) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;- In
TypeMatch.c:30:
Match(d) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;
}- In
TypeMatch.c:37:
// Unlisted type falls to Otherwise.
Match(p) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;- In
TypeMatch.c:38:
Match(p) {
When(int) tag = 0;
When(double) tag = 1;
Otherwise tag = 9;
}- In
TypeMatch.c:51:
double rd = 0.0;
Match(i) {
When(int) ri = it * 2;
When(double) rd = it;
}- In
TypeMatch.c:52:
Match(i) {
When(int) ri = it * 2;
When(double) rd = it;
}
Match(d) {- In
TypeMatch.c:55:
}
Match(d) {
When(int) ri = it;
When(double) rd = it * 2.0;
}- In
TypeMatch.c:56:
Match(d) {
When(int) ri = it;
When(double) rd = it * 2.0;
}
return ri == 42 && rd == 3.0;- In
TypeMatch.c:66:
// Scrutinee is an rvalue; copied by value into `it`.
Match(i + 1) {
When(int) hit = (it == 5);
When(double) hit = false;
}- In
TypeMatch.c:67:
Match(i + 1) {
When(int) hit = (it == 5);
When(double) hit = false;
}
return hit;- In
TypeMatch.c:76:
int count = 0;
Match(i) {
When(int) count++;
When(double) count++;
Otherwise count++;- In
TypeMatch.c:77:
Match(i) {
When(int) count++;
When(double) count++;
Otherwise count++;
}- In
TypeMatch.c:87:
bool hit = false;
Match(p) {
When(int) hit = false;
When(double) hit = false;
Otherwise hit = true;- In
TypeMatch.c:88:
Match(p) {
When(int) hit = false;
When(double) hit = false;
Otherwise hit = true;
}- In
TypeMatch.c:100:
double id = 0.0;
Match(i) {
When(int) {
Match(d) {
When(int) id = -1.0;- In
TypeMatch.c:102:
When(int) {
Match(d) {
When(int) id = -1.0;
When(double) id = it; // inner `it` : double
}- In
TypeMatch.c:103:
Match(d) {
When(int) id = -1.0;
When(double) id = it; // inner `it` : double
}
oi = it; // back to outer `it` : int
- In
TypeMatch.c:107:
oi = it; // back to outer `it` : int
}
When(double) oi = -1;
}
return oi == 10 && id == 3.5;- In
TypeMatch.c:123:
Position2D p = {1.0f, 2.0f};
Match(p) {
When(int)(void) it; // never matches Position2D, and there is no Otherwise
}
return true; // unreachable -- the match aborts first
Last updated on