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/function.txt
================================================================================
function - no return
================================================================================

fun sum(a: Int, b: Int) =
  todo

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (body
      (todo))))

================================================================================
function - return
================================================================================

fun sum(a: Int, b: Int) -> Int =
  todo

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (todo))))

================================================================================
function - default value
================================================================================

fun random(a: Int = 10) =
  todo

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier))
      (expression
        (primary_expression
          (integer))))
    (body
      (todo))))

================================================================================
function - generics
================================================================================

fun add(param: T, param2: List[U]) -> List[U] =
  todo

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (generic)))
    (param
      (var_identifier)
      (type
        (type_identifier)
        (type
          (generic))))
    (type
      (type_identifier)
      (type
        (generic)))
    (body
      (todo))))

================================================================================
function - bare self param (top-level, not a method receiver annotation)
================================================================================

fun remove(self, v: T) =
  todo

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

(source
  (fn
    (fn_identifier)
    (self)
    (param
      (var_identifier)
      (type
        (generic)))
    (body
      (todo))))

================================================================================
function - variant construction call (positional args on a capitalized name)
================================================================================

fun makeSome(v: Int) -> Option =
  Some(v)

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (expression
        (primary_expression
          (fn_call
            (type_identifier)
            (fn_argument_list
              (expression
                (primary_expression
                  (var_identifier))))))))))

================================================================================
function - bare comparison as body's trailing statement
================================================================================

fun isNone(o: Option) -> Bool =
  o == None

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (expression
        (comparison_operator
          (primary_expression
            (var_identifier))
          (primary_expression
            (type_identifier)))))))

================================================================================
function - bare boolean-operator as body's trailing statement
================================================================================

fun bothTrue(a: Bool, b: Bool) -> Bool =
  a && b

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (expression
        (boolean_operator
          (expression
            (primary_expression
              (var_identifier)))
          (expression
            (primary_expression
              (var_identifier))))))))

================================================================================
function - bare ternary as body's trailing statement
================================================================================

fun pick(cond: Bool, a: Int, b: Int) -> Int =
  cond ? a : b

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (param
      (var_identifier)
      (type
        (type_identifier)))
    (type
      (type_identifier))
    (body
      (expression
        (ternary_expression
          (expression
            (primary_expression
              (var_identifier)))
          (expression
            (primary_expression
              (var_identifier)))
          (expression
            (primary_expression
              (var_identifier))))))))

================================================================================
function - closure literal in expression position
================================================================================

fun useClosure() -> Bool =
  cb = |v|
    True
  cb(5)

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

(source
  (fn
    (fn_identifier)
    (type
      (type_identifier))
    (body
      (assign
        (var_identifier)
        (expression
          (closure
            (var_identifier)
            (body
              (expression
                (primary_expression
                  (type_identifier)))))))
      (expression
        (primary_expression
          (fn_call
            (var_identifier)
            (fn_argument_list
              (expression
                (primary_expression
                  (integer))))))))))

================================================================================
function - closure literal with no params
================================================================================

fun useClosure() -> Bool =
  cb = ||
    True
  cb()

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

(source
  (fn
    (fn_identifier)
    (type
      (type_identifier))
    (body
      (assign
        (var_identifier)
        (expression
          (closure
            (body
              (expression
                (primary_expression
                  (type_identifier)))))))
      (expression
        (primary_expression
          (fn_call
            (var_identifier)
            (fn_argument_list)))))))

================================================================================
function - closure with an inline ternary body
================================================================================

fun useClosure() -> Str =
  f = |n| n > 0 ? "pos" : "nonpos"
  f(5)

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

(source
  (fn
    (fn_identifier)
    (type
      (type_identifier))
    (body
      (assign
        (var_identifier)
        (expression
          (closure
            (var_identifier)
            (expression
              (ternary_expression
                (expression
                  (comparison_operator
                    (primary_expression
                      (var_identifier))
                    (primary_expression
                      (integer))))
                (expression
                  (primary_expression
                    (string
                      (string_start)
                      (string_content)
                      (string_end))))
                (expression
                  (primary_expression
                    (string
                      (string_start)
                      (string_content)
                      (string_end)))))))))
      (expression
        (primary_expression
          (fn_call
            (var_identifier)
            (fn_argument_list
              (expression
                (primary_expression
                  (integer))))))))))

================================================================================
function - function-value type param annotation
================================================================================

fun each(cb: fn(Int)) -> Bool =
  True

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (fn_value_type
        (type
          (type_identifier))))
    (type
      (type_identifier))
    (body
      (expression
        (primary_expression
          (type_identifier))))))

================================================================================
function - function-value type param annotation with generic types and return
================================================================================

fun each(cb: fn(T) -> U) -> Bool =
  True

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

(source
  (fn
    (fn_identifier)
    (param
      (var_identifier)
      (fn_value_type
        (type
          (generic))
        (type
          (generic))))
    (type
      (type_identifier))
    (body
      (expression
        (primary_expression
          (type_identifier))))))

================================================================================
function - inline closure literal as a call argument
================================================================================

fun main() -> Int =
  each(|v| v)

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

(source
  (fn
    name: (fn_identifier)
    returns: (type
      (type_identifier))
    body: (body
      (expression
        (primary_expression
          (fn_call
            function: (var_identifier)
            arguments: (fn_argument_list
              (expression
                (closure
                  parameters: (var_identifier)
                  body: (expression
                    (primary_expression
                      (var_identifier))))))))))))

================================================================================
function - multi-line closure literal call argument, closing paren on same line as body
================================================================================

fun main() -> Int =
  each(|v|
    v)

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

(source
  (fn
    name: (fn_identifier)
    returns: (type
      (type_identifier))
    body: (body
      (expression
        (primary_expression
          (fn_call
            function: (var_identifier)
            arguments: (fn_argument_list
              (expression
                (closure
                  parameters: (var_identifier)
                  body: (body
                    (expression
                      (primary_expression
                        (var_identifier)))))))))))))