ll.js 是一个由 javascript 实现的函数式语言,任何开启 javascript 支持的浏览器都可以运行它。函数式编程可以用另一种优雅的方式,(通常)用更少的代码获得同样的结果,由于函数式的直观和简短,通常我们的代码出错的概率会更少。目前 ll 语言其支持以下特性:
lambda 函数是只带有一个参数的匿名函数,它们的组合和排列能演绎出复杂的效果。声明函数通过反斜杠引出,具体见下:
--- 函数声明 ---
\n -> n + 1;
\n -> n * n;
\n -> n + n * n;
通过函数之间的组合,可以巧妙实现多参数的函数。
--- 两参数函数 ---
(\n -> \m -> m + n) 1 2 --- output: 3
使用 let 关键字声明变量:
--- 变量声明 ---
let x = 5;
let y = \n -> n + 1;
let z = true;
let p = "hello world";
通过语法糖,声明一个多参数的函数更加简单快捷了。
---多参数函数 ---
let add x y = x + y;
let result = add 1 2;
利用 let 柯里化一个函数:
---柯里化 ---
let add x y = x + y;
let add3 = add 3;
print (add3 5);
目前内置了一些原始操作符和原生函数,唯有的几个中缀函数让编写表达式计算更加方便:
--- 原生函数 ---
print "hello world";
print 1 > 2;
print 3 == 3;
print 4 + 6 * 5;
print (length [1,2,3,4]);
print (reverse [1,2,3,4]);
print ([1,2,3] !! 1);
通过 $ 和 . 的运用,可以写出优美直观,符合 Point-Free Style 的程序。
--- 计算 (10 + 10) ^ 2 ---
let double = \n -> n + n;
let square = \n -> n * n;
print $ double $ square 10;
let func = double . square;
print $ func 10;
对同一个函数使用不同的参数, 可以自动匹配出不同的处理,可以使用类型来匹配(Boolean, List, Number, String),也可以使用具体的值.
--- 类型匹配 ---
let echo a@Number = print 'Number';
let echo a@String = print 'String';
echo 'this is string';
可以将值匹配和类型匹配混合用
--- 值匹配 ---
let echo a@1 = print 'Number 1';
let echo a@Number = print 'Other number';
let echo a@* = print 'Other type';
echo 1;
使用模式匹配需要注意的是, 同名函数的参数长度必须相同, 每个参数的描述都要用 @ 隔开并且有描述符. 同名函数的参数顺序和名字要一样.
--- 模式匹配在阶乘中 ---
let fact n@1 = 1;
let fact n@Number = n * (fact n - 1);
print $ fact 5;