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.