The most basic sort of definition looks like this:
This defines a function called fred whose value is the number 12. The // marks a comment: everything to the end of the line is skipped. Case is distinguished, so Fred and fred are two different functions. You can use letters, numbers, underscores and single quotes in function names.
You can have patterns on the left of the equals sign. For example:
defines fred to have the value 12 and petra to have the value 13. See §6.9 for details.
Functions may take parameters:
This defines a function called jim which takes two parameters and whose value is the sum of the two parameters, plus 12. The /⋆ and ⋆/ enclose a multi-line comment.
Functions may have several right-hand-sides, each right-hand-side qualified by a guard expression. Guards are tested from top to bottom and the first guard which has the value true causes the function to have the value of that right-hand-side. If no guard evaluates to true, then the last right-hand-side is used.
This defines a function called jenny which takes two parameters and whose value is 42 if the sum of the parameters is 100 or greater; 43 if the sum is greater than or equal to 50 but less than 100; and 44 if the sum is less than 50.
Any function may be followed by any number of local functions, enclosed in curly braces. So jenny could be written as:
Note that you need a semi-colon after each local function. A local function may refer to anything in an enclosing scope, including itself.
You can write if-then-else expressions:
This is exactly equivalent to:
if-then-else expressions are sometimes easier to read than guards.
Functions application is with spaces (juxtaposition). For example:
defines harry to have the value 17.
All functions are curried, that is, they can accept their arguments in stages. For example:
defines sandro, a function which takes one parameter and will add 13 to it. This trick becomes very useful with list processing, see §6.7.
nip2 has some built-in functions, see Table 6.1. They mostly take a single argument. All other functions are defined in the various standard toolkits and can be edited in the program window.
|dir any||List names in scope|
|has_member [char] any||Does class have member|
|name2gtype [char]||Search for a GType by name|
|gtype2name real||Return the name of a GType|
|error [char]||Stop with error message|
|print any||Convert to string|
|expand [char]||Expand environment variables in string|
|search [char]||Search for a file|
|_ [char]||Translate string|
|is_image any||Test for image|
|is_bool any||Test for boolean|
|is_real any||Test for real|
|is_class any||Test for class|
|is_char any||Test for char|
|is_list any||Test for list|
|is_complex any||Test for complex|
|is_instanceof [char] any||Test for instance of class|
|re image/complex/class||Extract real part of complex|
|im image/complex/class||Extract imaginary part of complex|
|hd list||Extract head of list|
|tl list||Extract tail of list|
|asin image/number/class||Arc sine|
|acos image/number/class||Arc cosine|
|atan image/number/class||Arc tangent|
|log image/number/class||Natural log|
|log10 image/number/class||Base 10 log|
|exp image/number/class||e to the power|
|exp10 image/number/class||10 to the power|
|ceil image/number/class||Round up|
|floor image/number/class||Round down|
|gammq real real||Normalised incomplete Gamma function|
|vips_image [char]||Load image from file|
|read [char]||Load file as a string|