plum

#treesitter#compiler#wasm

git clone https://git.pyrossh.dev/plum

A statically typed, imperative programming language inspired by rust, python


plum-tooling/tree-sitter-plum/test/corpus/match.txt
================================================================================
match
================================================================================

fun main() =
  match a
    1 =>
      printLn(a)
    "hi" =>
      printLn(a)
    True =>
      printLn(a)
    Some(b) =>
      printLn(b)
    x =>
      printLn(x)
    _ =>
      printLn(a)

--------------------------------------------------------------------------------

(source
  (fn
    (fn_identifier)
    (body
      (match
        (expression
          (primary_expression
            (var_identifier)))
        (case
          (case_pattern
            (integer))
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))
        (case
          (case_pattern
            (string
              (string_start)
              (string_content)
              (string_end)))
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))
        (case
          (case_pattern
            (type_identifier))
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))
        (case
          (case_pattern
            (class_pattern
              (type_identifier)
              (case_pattern
                (dotted_name
                  (var_identifier)))))
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))
        (case
          (case_pattern
            (dotted_name
              (var_identifier)))
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))
        (case
          (case_pattern)
          (body
            (expression
              (primary_expression
                (fn_call
                  (var_identifier)
                  (fn_argument_list
                    (expression
                      (primary_expression
                        (var_identifier)))))))))))))

================================================================================
match - inline case bodies
================================================================================

fun main() =
  match a
    1 => printLn(a)
    2 => printLn(b)
    _ => printLn(c)

--------------------------------------------------------------------------------

(source
  (fn
    (fn_identifier)
    (body
      (match
        (expression
          (primary_expression
            (var_identifier)))
        (case
          (case_pattern
            (integer))
          (expression
            (primary_expression
              (fn_call
                (var_identifier)
                (fn_argument_list
                  (expression
                    (primary_expression
                      (var_identifier))))))))
        (case
          (case_pattern
            (integer))
          (expression
            (primary_expression
              (fn_call
                (var_identifier)
                (fn_argument_list
                  (expression
                    (primary_expression
                      (var_identifier))))))))
        (case
          (case_pattern)
          (expression
            (primary_expression
              (fn_call
                (var_identifier)
                (fn_argument_list
                  (expression
                    (primary_expression
                      (var_identifier))))))))))))

================================================================================
match - guard-clause arms, no subject
================================================================================

fun compare(x: Int, y: Int) -> Int =
  match
    | x > y =>
      1
    | x == y =>
      0
    | _ =>
      -1

--------------------------------------------------------------------------------

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (match
        (guard_case
          (expression
            (comparison_operator
              (primary_expression
                (var_identifier))
              (primary_expression
                (var_identifier))))
          (body
            (expression
              (primary_expression
                (integer)))))
        (guard_case
          (expression
            (comparison_operator
              (primary_expression
                (var_identifier))
              (primary_expression
                (var_identifier))))
          (body
            (expression
              (primary_expression
                (integer)))))
        (guard_case
          (body
            (expression
              (primary_expression
                (unary_operator
                  (primary_expression
                    (integer)))))))))))