Pattern matching is-expressions
Stefan Koch
uplink.coder at googlemail.com
Wed Aug 19 07:29:18 UTC 2020
Hi there,
Recently I have been thinking about converting commonly used is
expressions into __traits,
since having that makes type functions more consitent.
So let me first talk about the problem.
let's say for type T you wanted write an is expression which
matchs a on slice types.
you would write:
static if (is(T == U[], U))
{
pragma(msg, "I have seen a slice of type " ~ U.stringof);
}
Which means If there is any U such that U[] is the same type as
T, return true and inject the name U into the scope below.
As long as that scope is a `static if`.
We are effectively changing the ast here.
The is expression is not just a query but also injecting a node.
Note: what I wrote above is what's in the spec.
In reality the is expression makes U a name immediately and not
just in the static if scope below.
consider this example:
`static if (is(P[0] S == super) && is(S[0] == ASTNode))`
Which means:
iff there is a tuple P AND P has at least one element AND for
tuple P the first element of P is a class or interface AND P[0]
is not object or the first interface in an interface hierachy,
introduce a new name S which is a tuple of the parent classs or
interfaces of P[0], THEN evluate the is expression to true;
AND iff there is a tuple S AND S has at least one element AND
there is a type called ASTNode AND the first elemennt of S is the
type called ASTNode THEN evaluate the is-expression to true.
If the latter is expression is true that implies that the former
is expression was true.
We can see that S is a valid tuple immediately after, (and even
inside), the expression which created it.
That's helpful in this case because otherwise if'd have to one
nest more `static if`.
To make the issue clearer let me reframe this a little.
this expression is(P S == super) is rougly equivalent to the
question:
"Do you have a father?"
So you ask that question and the answer is "Yes I do have a
father, his name is Bernd, also that's him just there, and he is
going to live with you now."
That is a problem if you don't have room for Bernd at your home.
If you write the following into a new file
```
int[] ia;
pragma(msg, "ia is an array ", is(typeof(ia) == U[], U), " and
it's element type is: ", U);
```
The output will be:
`ia is an array true and it's element type is: int`
which you can check here https://run.dlang.io/is/iKZSvQ
This works because the is expression installed the name U in your
scope.
At least in my opinion this is very diffrent to the way D behaves
anywhere else in the language.
What do you think?
Greetings,
Stefan
More information about the Digitalmars-d
mailing list