在ELite中,函数是非常重要的概念(它是一类公民),我们也知悉了,ELite中的函数,本质上就是Lambda表达式,只不过在ELite中,为Lambda表达式提供了一种符合人们对传统函数定义方式的一种语法糖而已,因此,在后文中,我们将把上述这种Lambda表达式的定义方式称为函数定义,而不再显式说明它们是lambda表达式。
函数可以拥有返回值,其关键字为return,但与Java不同的是,您无需指定返回类型,并且,在ELite中,您可以省略return,此时,会以函数体以最后一行表达式的返回值作为函数体的返回值。
下述示例中,两种定义方式等价。
> define sum(x,y){ return x + y }
> sum(1,2);
3
> define sum(x,y){ x + y }
> sum(1,2);
3
>
特别的,如果函数没有返回值,可以使用void修饰符,当使用了void修饰符时define关键字可以省略。
如下:
> //Lambda定义方式
> define prn = { s => System.out.println(s)};
> prn("Hello World");
Hello World
> //以函数方式定义
> define void prn(s) { System.out.println(s) }
> prn ("Hello World");
Hello World
> // 当有void关键字时,可以省略define 关键字
> void prn(s) { System.out.println(s) }
> prn ("Hello World");
Hello World
>
在ELite 中,函数可以递归,例如下面的表达式可以计算[3]菲波那契数列。
> define fib(x) {\
2) x <=2 ? 1 : fib(x-1) + fib(x-2);\
3) }
> fib(12);
144
>
为了加深您的印象,我们把上述语句换成“正宗”的Lambda表达式语法:
> define fib = { x =>\
2) x<=2 ? 1 : fib(x-1) + fib(x-2);\
3) }
> fib(12);
144
>
函数本身也是对象,因此可以作为其他函数的参数,或作为表达式的返回值。
> define sum(x,y) { x + y};
> define exec(f, x, y) { return f(x,y) }
> exec(sum, 1, 2);
3
>
上述示例的本质是:将 sum 这个函数作为参数,传递给了另外一个函数 exec。同时,需要提醒您的是,上述示例第二行语句中的 return 可以省略掉,因为在 ELite 中,如果函数体以最后一行表达式的返回值作为函数体的返回值。
依此类推,Java对象方法(包括类方法)可以作为闭包传递给函数,同样还是上面的例子:
> define exec(f, x, y) { return f(x,y) }
> exec(Math.pow, 2, 3);
8.0
>