plum
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)))))))))))))