Lambda Expression
Lambda expression is a function definition with only one statement.
Syntax
def <functionName>(parameters): expression
or
def (parameters): expression
or
def (parameters) -> expression
or
parameter -> expression
Details
Lambda expression can be either a named function or anonymous function. It takes any number of parameters but has only one expression. The second, third, and fourth of the aforementioned syntax define an anonymous Lambda function and the fourth syntax only applies to a statement with one parameter. An anonymous Lambda function can be used in the following ways.
- 
                    Assigned to a variable, e.g. f=def(x):x*x.
- 
                    Used as the parameter to a function, e.g. each(def(a,b):a+b, 1..10, 2..11).
- 
                    Used as the return value of a function, e.g. def(x){return def(k): k*x}.
- 
                    Besides the aforementioned usages, Lambda expression can also be wrapped in curly braces {}, which supports: - 
                            Used as a function with one parameter, e.g. {x->x*x}(10).
- 
                            Used as an operator. The precedence of binary operators is the same as that of multiplication and division, while unary operators have the lowest precedence. For example, the correct precedence of {x->x*x} 10 {x,y->x+y} 1is to first execute10 {x,y->x+y} 1, which results in 11, and then apply{x->x*x}to 11 and return the final result 121.
- 
                            Used with symbols of higher-order functions, e.g. {x->x*x + x}:E matrix(1 2 3, 4 5 6).
- Called by object.method().
 
- 
                            
Examples
def f(x):x pow 2 + 3*x + 4.0;
f(2);
// output: 14
def orderby(x,y): x[isort y];
t=table(3 1 7 as id, 7 4 9 as value);
orderby(t, t.id);| id | value | 
|---|---|
| 1 | 4 | 
| 3 | 7 | 
| 7 | 9 | 
each(def(a,b):a+b, 1..10, 2..11);
// output: [3,5,7,9,11,13,15,17,19,21]
g = def (x,y) -> log(x) + y pow 2;
g(e,0);
// output: 1
each(x->x+1,1 3 5)
// output: [2,4,6]Used as the return value of a function:
def f1(x){return def(k): pow(x,k)}
f1(1)
//output: {def (x, k)->power(x, k)}{1}
f1(1)(10)  
//output: 1Examples of Lambda expression wrapped in curly braces {}:
- 
                    Used as a function: {x->x*x}(2) //output: 4 // Wrap an aggregate function {defg(x)-> sum(x)/max(x)}(2 5 6) //output: 2
- 
                    Used as an operator: {def(x):x*x} 4 //output: 162 *{x->x*x} 10 {x,y->x+y} 1 //output: 242
When used as a unary operator, multiple operators can be used consecutively in a single expression:
{x->x*x}{x->x+1}{x->x*2} 10
//output: 441Call Lambda expression using
                    object.method().
v = 1..6 
v.{x->x*x+1}() 
// output [2,5,10,17,26,37]object.method() can also be used with
                    higher-order functions. For example, to apply the Lambda expression on each row
                    of a matrix, you can use object.method() with
                        byRow(:H):
m = matrix(1 2 3, 4 5 6, 7 8 9) 
m.{x->cumavg(x)*x+x}:H()| #0 | #1 | #2 | 
| 2 | 14 | 35 | 
| 6 | 22.5 | 48 | 
| 12 | 33 | 63 | 
