1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2021 年 4 月 20 日

404编程语言

3,278 星 & 17 关注者

170KB
5K SLoC

Rust 4.5K SLoC // 0.0% comments · Rust 包仓库 JavaScript 506 SLoC // 0.0% comments · Rust 包仓库

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.rssrc/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