


List patterns are written using syntax essentially identical to those of list expressions. Lists may be matched in their entirety using notation like [ a, b, c ]:
linux$ cat my-script
#!/usr/bin/mythryl
r = [ 1, 2, 3 ]; # List expression.
case r
[ a, b, c ] => printf "Three-element list summing to %d.\n" (a+b+c);
[ a, b ] => printf "Two-element list summing to %d.\n" (a+b);
[ a ] => printf "One-element list summing to %d.\n" a;
[] => printf "Zero-element list summing to 0.\n";
_ => printf "Unsupported list length.\n";
esac;
linux$ ./my-script
Three-element list summing to 6.
More typically, lists are pattern-matched into head-tail pairs head ! tail and processed recursively:
linux$ cat my-script
#!/usr/bin/mythryl
r = [ 1, 2, 3 ];
fun sum_list ([], sum) => sum;
sum_list (i ! rest, sum) => sum_list (rest, sum + i);
end;
printf "%d-element list summing to %d.\n" (list::length r) (sum_list (r, 0));
linux$ ./my-script
3-element list summing to 6.
List patterns and other patterns may be nested arbitrarily:
linux$ cat my-script
#!/usr/bin/mythryl
r = [ (1,2), (3,4), (5,6) ];
fun sum_list ([], sum) => sum;
sum_list (pair ! rest, sum) => sum_list (rest, sum + (+)pair);
end;
printf "%d-pair list summing to %d.\n" (list::length r) (sum_list (r, 0));
linux$ ./my-script
3-pair list summing to 21.


