Introduction | 介绍

ll.js 是一个由 javascript 实现的函数式语言,任何开启 javascript 支持的浏览器都可以运行它。函数式编程可以用另一种优雅的方式,(通常)用更少的代码获得同样的结果,由于函数式的直观和简短,通常我们的代码出错的概率会更少。目前 ll 语言其支持以下特性:

  • lambda 函数定义
  • 函数柯里化, lazy-evaluation, 匿名递归(利用 z-combinator)
  • 模式匹配
  • Point-free 风格编程
  • 数字,字符串,布尔型计算,以及 +-*/ 中缀操作符的支持
  • if ... else ... 判断分支

.ZIP file.TAR fileGithub

Usage | 使用方法

Lambda function | 匿名函数

lambda 函数是只带有一个参数的匿名函数,它们的组合和排列能演绎出复杂的效果。声明函数通过反斜杠引出,具体见下:

--- 函数声明 ---
\n -> n + 1;
\n -> n * n;
\n -> n + n * n;

通过函数之间的组合,可以巧妙实现多参数的函数。

--- 两参数函数 ---
(\n -> \m -> m + n) 1 2 --- output: 3

Various declaration | 变量声明

使用 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);

Native function | 原生函数

目前内置了一些原始操作符和原生函数,唯有的几个中缀函数让编写表达式计算更加方便:

--- 原生函数 ---
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

通过 $ 和 . 的运用,可以写出优美直观,符合 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;

Pattern matching | 模式匹配

对同一个函数使用不同的参数, 可以自动匹配出不同的处理,可以使用类型来匹配(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;