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.