6.9 Pattern matching
Any time you define a name, you can use a pattern
instead. For example:
[fred, petra] = [12, 13]
defines fred to have the value 12 and petra to have the value
13.
A pattern describes the structure you are expecting for the
value. When the value is computed it is matched against the
pattern and, if the match is successful, the names in the
pattern are bound to those parts of the value. Our example is
exactly equivalent to:
temp = [12, 13];
fred
= temp?0, is_list temp &&
is_list_len 2 temp
= error "pattern match failed";
petra
= temp?1, is_list temp &&
is_list_len 2 temp
= error "pattern match failed";
where temp is an invisible, anonymous symbol.
You can pattern match on any of nip2’s data structures and
types. You can use:
-
a:b
- Tests for the value being a non-empty list and then
assigns a to the head and b to the tail.
-
(a,b)
- Tests for the value being a complex and then
assigns a to the real part and b to the imaginary.
-
[a,b,c]
- Tests for the value being a list of length three and
then assigns a, b and c to the three elements.
-
(class - name b)
- Tests for the value being an instance
of the named class, then assigns b to that class
instance.
-
constant
- Tests for the value being equal to that constant.
Constants are things like ”hello world” or 12.
You can nest patterns in any way you like. Patterns are
useful in conjunction with list comprehensions, see
§6.6.5.
You can’t use patterns in function arguments in the
current version, hopefully this will added shortly.