Function - MrKaszeba19/PapajLang GitHub Wiki

Function is an entity type used in PapajScript. It stores instructions that may be executed when calling it.

History

Pre-built functions existed since the birth of RPN Calculator (the first functions, then-called operands, were +, -, *, /). The first blocks of instructions were introduced on April 26, 2018 along with release of the 0.4.0 version. The breakthrough happened on November 8, 2018, when the Function entity type was introduced along with release of the 0.4.1 version. The fun{ } syntax remained unchanged until August 2, 2020. Starting from version 0.5.0, the functions will have 4 ways to define.

Syntaxes

  • fun{ <instructions> }
  • fun { <instructions> }
  • function{ <instructions> }
  • function { <instructions> }

Features

  • Function can be called using call. If it stored as a variable, then it may be called using fvar vcall, @@fvar or explicitly fvar.
  • As of now, there is no limit how many values functions can take from the stack.
  • Functions can return 1 or more values, also they can return no values or remove them from the stack.
  • The variables declared inside a function are not usable outside its scope.
  • The ( <instructions> ) technically used to be an entity of Function type. Since August 2020 it was Expression, later replaced by LogicalExpression.
  • Since April 18, 2021 functions may have input parameters. They are enclosed by parentheses and delimited by spaces, e.g. function ( x y ) { x y * sqrt }

Examples

  • fun{ 2 2 + } executed puts 2 2 + (i.e. 4) on the stack
  • fun { 2 ^ ++ } >test is a function stored in a variable test. Executed gets a value from the stack, squares it and increments. E.g. 5 test returns 26 and puts it on the stack.
  • function{ 3.785 / } >toGallons converts liters to US gallons (it gets a value from the stack, divides by 3.785 and puts the result on the stack)
  • function { -1 * } >invert makes a positive number negative and vice versa.
  • Example of a function with parameters
function ( x y ) { 
    x y * sqrt 
} 
-> geomAvg

16 8 geomAvg