6.3 Syntax

The most basic sort of definition looks like this:

// very simple!  
fred = 12

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:

[fred, petra] = [12, 13]

defines fred to have the value 12 and petra to have the value 13. See §6.9 for details.

Functions may take parameters:

/⋆ A function with parameters.  
 ⋆/  
jim a b = a + b + 12

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.

jenny a b  
  = 42, a + b >= 100  
  = 43, a + b >= 50  
  = 44

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:

jenny a b  
  = 42, sum >= 100  
  = 43, sum >= 50  
  = 44  
{  
  sum = a + b;  
}

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:

david a = if a < 12 then "my cat"  
  else "likes lasagne"

This is exactly equivalent to:

david a  
  = "my cat", a < 12  
  = "likes lasagne"

if-then-else expressions are sometimes easier to read than guards.

Functions application is with spaces (juxtaposition). For example:

harry = jim 2 3

defines harry to have the value 17.

All functions are curried, that is, they can accept their arguments in stages. For example:

sandro = jim 1

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.




Function Description


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
sin image/number/class Sine
cos image/number/class Cosine
tan image/number/class Tangent
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/class10 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



Table 6.1: nip2 built in functions