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.