Pattern Matching

Pattern matching is written using tree MATCH(CASE(...), ...):

DEF("maxList", "T")
    withTypeParams(TYPEVAR("T") VIEWBOUNDS TYPE_ORDERED("T"))
    withParams(PARAM("elements", TYPE_LIST("T"))) :=
  REF("elements") MATCH (
    CASE(ListClass UNAPPLY()) ==>
      THROW(IllegalArgumentExceptionClass, "empty list!"),
    CASE(ListClass UNAPPLY(ID("x"))) ==> REF("x"),
    CASE(ID("x") UNLIST_:: ID("rest")) ==> BLOCK(
      VAL("maxRest") := REF("maxList") APPLY(REF("rest")),
      IF(REF("x") INT_> REF("maxRest")) THEN REF("x")
      ELSE REF("maxRest") 
    )
  )

This prints as:

def maxList[T <% Ordered[T]](elements: List[T]): T =
  elements match {
    case List() =>
      throw new IllegalArgumentException("empty list!")
    case List(x) => x
    case x :: rest => {
      val maxRest = maxList(rest)
      if (x > maxRest) x
      else maxRest
    }
  }