Lambda-Lite-js

JavaScript 实现的函数式语言
授权协议 MIT
开发语言 JavaScript
所属分类 Web应用开发、 常用JavaScript包
软件类型 开源软件
地区 国产
投 递 者 柯曜文
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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

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

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;

 

 相关资料
  • 编译时得到这个错误 意外标记(使用;分隔同一行的表达式) 柯特林 lambda 函数语法是否与 Java Lambda 表达式略有不同?

  • 我有一个lambda函数,它成功地执行了一个名为的意图,该意图返回一个特定的字符串。为了测试目的,我已经为这个意图创建了一个话语(一个简单的话语,不需要任何可选的插槽来调用这个技能),但是当使用服务模拟器用这个话语测试lambda函数时,我会遇到表示的lambda响应。下面是交互模型的样子: 使用适当的自定义技能类型语法, 当向Alexa提供语句时,lambda响应应该像在执行中一样输出字符串。我

  • 本文向大家介绍C语言实现时区转换函数的实例,包括了C语言实现时区转换函数的实例的使用技巧和注意事项,需要的朋友参考一下 C语言实现时区转换函数的实例 时区转换函数 功能: 把时区1的时间转换成时区2的时间 参数: arg1 -- 输入时间 arg2 -- 时区1(也是arg1当前时间所在的时区) arg3 -- 时区2(要转换的时区的时间)  要求: 参数arg1类型可为timestamp 24个

  • 有时您可能只需要在程序中的一个位置使用一个函数,并且该函数非常简单,您可能不会给它命名,或者可能不想将它存储在符号表中,而宁愿编写一个未命名或匿名的函数。 LISP允许您编写仅在程序中遇到它们时才计算的匿名函数。 这些函数称为Lambda functions. 您可以使用lambda表达式创建此类函数。 lambda表达式的语法如下 - (lambda (parameters) body) 无法

  • 主要内容:结构体实现接口,函数体实现接口,HTTP包中的例子函数和其他类型一样都属于“一等公民”,其他类型能够实现接口,函数也可以,本节将对结构体与函数实现接口的过程进行对比。 首先给出本节完整的代码: 有如下一个接口: 这个接口需要实现 Call() 方法,调用时会传入一个 interface{} 类型的变量,这种类型的变量表示任意类型的值。 接下来,使用结构体进行接口实现。 结构体实现接口 结构体实现 Invoker 接口的代码如下: 代码说明如下:

  • 本文向大家介绍C语言拓展实现Lua sleep函数,包括了C语言拓展实现Lua sleep函数的使用技巧和注意事项,需要的朋友参考一下 这几天在做一个小项目,其中用到了一些基本的API, 例如sleep,获取当前目录等等,lua标准库中没有提供这些接口,虽然所第三方库中也都有实现,但是要用的就那么几个函数,在一个嵌入式系统中安装那么多第三方库有点浪费资源,于是@胜利哥 写了一个socket的C实现