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/enum.txt
================================================================================
enum
================================================================================

enum Bool =
  | True
  | False

  fun toStr() -> Str =
    "Bool"

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

(source
  (enum
    (type_identifier)
    (field
      (type_identifier))
    (field
      (type_identifier))
    (fn
      (fn_identifier)
      (type
        (type_identifier))
      (body
        (expression
          (primary_expression
            (string
              (string_start)
              (string_content)
              (string_end))))))))

================================================================================
enum - generic variant fields
================================================================================

enum Option =
  | Some(T)
  | None

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

(source
  (enum
    (type_identifier)
    (field
      (type_identifier)
      (type
        (generic)))
    (field
      (type_identifier))))

================================================================================
enum - nested generic variant field
================================================================================

enum Json =
  | JsonList(List[Json])
  | JsonNull

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

(source
  (enum
    (type_identifier)
    (field
      (type_identifier)
      (type
        (type_identifier)
        (type
          (type_identifier))))
    (field
      (type_identifier))))

================================================================================
enum - nested method declaration
================================================================================

enum Step =
  | ReadMin
  | ReadMax

  fun toNumber(self) -> Int =
    match self
      ReadMin => 0
      ReadMax => 1

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

(source
  (enum
    (type_identifier)
    (field
      (type_identifier))
    (field
      (type_identifier))
    (fn
      (fn_identifier)
      (self)
      (type
        (type_identifier))
      (body
        (match
          (expression
            (primary_expression
              (self)))
          (case
            (case_pattern
              (type_identifier))
            (expression
              (primary_expression
                (integer))))
          (case
            (case_pattern
              (type_identifier))
            (expression
              (primary_expression
                (integer)))))))))

================================================================================
enum - discriminant values
================================================================================

enum Step(n: Int) =
  | ReadMin(0)
  | ReadMax(1)

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

(source
  (enum
    (type_identifier)
    (enum_param
      (var_identifier)
      (type
        (type_identifier)))
    (field
      (type_identifier)
      (expression
        (primary_expression
          (integer))))
    (field
      (type_identifier)
      (expression
        (primary_expression
          (integer))))))

================================================================================
enum - named payload fields
================================================================================

enum Shape =
  | Circle(radius: Int)
  | Square(x: Int, y: Int)

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

(source
  (enum
    (type_identifier)
    (field
      (type_identifier)
      (enum_named_field
        (var_identifier)
        (type
          (type_identifier))))
    (field
      (type_identifier)
      (enum_named_field
        (var_identifier)
        (type
          (type_identifier)))
      (enum_named_field
        (var_identifier)
        (type
          (type_identifier))))))