1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2021 年 4 月 20 日 |
---|
404 在 编程语言
3,278 星 & 17 关注者
170KB
5K SLoC
pua-lang
用 Rust 编写的 PUA 编程语言。
什么是 pua-lang?
pua-lang 是 Monkey 编程语言的方言,旨在模仿阿里巴巴经理的“阿巴阿巴”式的灵感和喧哗。名称“pua”指的是阿里巴巴对待员工的方式——就像搭讪艺术家对待他们的战利品一样。
此实现是 rs-monkey-lang 的分支。《Monkey》是一种编程语言,旨在学习解释器。它来自 用 Go 编写解释器。
尝试 pua-lang!
使用 wasm playground
https://flaneur2020.github.io/pua-lang/
我们注意到输出流并不完全工作。Rust 并没有真正的 I/O 重定向,而 wasm32-unknown-unknown
默认没有 I/O。
使用 REPL
$ git clone https://github.com/flaneur2020/pua-lang.git
$ make repl
文档
⚠️ 请注意,可能存在一些错误。
摘要
- 拥有 Monkey 所有的功能
- C 语言语法
- 变量绑定
- 整数和布尔值
- 字符串数据结构
- 数组数据结构
- 哈希数据结构
- 算术表达式
- 内置函数
- 一等和 Higher-order 函数 • 闭包
- Unicode 标识符(UAX #31,XID)加上货币扩展(
[¥$_]
)以及过宽松的 Emoji 定义。 - Rust 兼容的双引号字符串语法。
- 关于“阿巴阿巴”的荒谬命名。与 Monkey 的比较
Monkey | pua-lang | 说明 |
---|---|---|
if | 细分 | "专业化" |
else | 路径 | "路径" |
while | 闭环 | "闭环" |
break | 破圈 | "突破圈子" |
true | 三七五 | "3.75",一个合格的性能评估结果 |
false | 三二五 | "3.25",一个不合格的性能评估结果 |
let | 赋能 | "赋能" |
fn | 抓手 | "抓手",类似于抓住事物 |
return | 反哺 | "反哺",在阿里巴巴作为系统反馈的一般术语 |
Array | 组合拳 | "组合拳";目前还不是语言中的词汇 |
Hash | 载体 | "载体";目前还不是语言中的词汇 |
= | 对齐 | "对齐" |
+ | 联动 | "联动" |
- | 差异 | "差异" |
/ | 倾斜 | "倾斜" |
puts | 输出 | "输出" |
quit | 淘汰 | "淘汰" |
(atoi) | 量化 | 量化 |
精确的重命名集合可能会随着我们探索新的 盈利途径 而不断变化,以完全实现我们 股东 客户的期望。我们鼓励您(嗯)仔细研究 src/lexer/mod.rs
和 src/evaluator/builtins.rs
的精神,以便与阿里语系保持一致,并最大限度地提高您的输出。
语法概述
斐波那契函数的一个示例。
赋能 fib = 抓手(x) {
细分 (x 对齐 0) {
反哺 0;
}
细分 (x 对齐 1) {
反哺 1;
} 路径 {
反哺 fib(x - 1) 联动 fib(x - 2);
}
};
fib(10);
细分
细分支持一般的细分
。存在路径
,但 细分 路径
尚未存在。
细分 (三七五) {
10;
} 路径 {
5;
}
闭环
有了闭环,只要条件是三七五,我们就可以执行一系列语句。
闭环 (三七五) {
输出("年年有抓手");
}
运算符
它支持一般的运算。
1 + 2 + (3 * 4) - (10 / 5);
!三七五;
!三二五;
+10;
-5;
"年年有抓手" + " " + "岁岁有闭环";
反哺
它立即返回值。不会执行进一步的处理。
细分 (三七五) {
反哺;
}
赋能 不变 = 抓手(工资p6) {
反哺 工资p6;
};
不变("👨💻🐒烧酒");
赋能
赋能,如许多编程语言所支持的,已实现。可以使用赋能
关键字定义变量。
格式
赋能 <identifier> = <expression>;
示例
赋能 x = 0;
赋能 y = 10;
赋能 福报 = add(5, 5);
赋能 alias = 福报;
赋能 identity = 抓手(x) { x };
字面量
实现了五种类型的字面量。
整数
Integer
表示一个整数值。不能处理浮点数。
格式
[-+]?[1-9][0-9]*;
示例
10;
1234;
布尔
Boolean
表示一个一般的布尔类型。
格式
三七五 | 三二五;
示例
三七五;
三二五;
赋能 truthy = !三二五;
赋能 falsy = !三七五;
字符串
String
表示一个字符串。只能使用双引号。
格式
"<value>";
示例
"Monkey Programming Language";
"Hello" + " " + "World";
组合拳
组合拳
表示一个有序的连续元素。每个元素可以包含不同的数据类型。
格式
[<expression>, <expression>, ...];
示例
[1, 2, 3 + 3, fn(x) { x }, add(2, 2), 三七五];
赋能 组合拳 = [1, 三七五, 抓手(x) { x }];
组合拳[0];
组合拳[1];
组合拳[2](10);
组合拳[1 + 1](10);
载体
载体
表示与值关联的数据。
格式
{ <expression>: <expression>, <expression>: <expression>, ... };
示例
赋能 载体 = {
"name": "Jimmy",
"age": 72,
三七五: "a boolean",
99: "an integer"
};
载体["name"];
载体.name;
载体["a" + "ge"];
载体[三七五];
载体[99];
载体[100 - 1];
抓手
抓手
支持其他编程语言支持的函数。
格式
抓手 (<parameter one>, <parameter two>, ...) { <block statement> };
示例
赋能 add = 抓手(x, y) {
反哺 x 联动 y;
};
add(10, 20);
赋能 add = 抓手(x, y) {
x 联动 y;
};
add(10, 20);
如果不存在反哺
,则返回最后一个评估表达式的结果。
赋能 addThree = 抓手(x) { x + 3 };
赋能 callTwoTimes = 抓手(x, f) { f(f(x)) };
callTwoTimes(3, addThree);
传递函数、高阶函数和闭包也将正常工作。
内置函数
您可以使用 1 个内置函数 🚀
输出(<arg1>, <arg2>, ...):void
它将指定的值输出到 stdout
。在 Playgound 的案例中,它输出到 console
。
输出("年年有抓手");
输出("岁岁有闭环!");
依赖
~0.7–1.9MB
~59K SLoC