25 个版本
0.4.1 | 2022 年 12 月 30 日 |
---|---|
0.4.0 | 2022 年 8 月 29 日 |
0.3.7 | 2021 年 12 月 9 日 |
0.3.6 | 2021 年 10 月 25 日 |
0.1.8 | 2021 年 8 月 31 日 |
#258 在 编程语言
435KB
10K SLoC
Pushr
Pushr 是一个基于 Rust 的 Push 程序的解析器。
什么是 Push?
Push 是一种基于栈的、图灵完备的编程语言,它能够在其程序中实现自构建进化。更多信息可以在 这里 找到。
支持的栈类型
此实现支持所有 Push3 指令,这些指令在 Push 3.0 编程语言描述 中描述的类型。
- 布尔值
- 代码
- 执行
- 浮点数
- 整数
- 名称
其他栈类型
- BOOLVECTOR:具有布尔元素的向量
- FLOATVECTOR:具有浮点元素向量
- INTVECTOR:具有整数元素向量
- INDEX:简化循环语法
- GRAPH:用作内存的图对象
FIFO 队列用于与其他模块通信。类型为 BOOLVECTOR。
- 输入
- 输出
支持的指令
默认的向量类型指令包括 'dup', 'equal', 'flush', 'get', 'set', 'shove', 'stackdepth', 'rand', 'swap', 'yank' 和 'yankdup'。此外,指令集还包括浮点数和整数向量的 'add', 'subtract', 'multiply' 和 'divide',以及布尔向量的 'and', 'or' 和 'not'。要初始化向量,可以使用 'ones' 和 'zeros' 指令。
对于向量指令,以下规则适用
-
'rand' 指令在布尔、浮点数和整数向量中解释不同
- BOOLVECTOR.RAND 在长度为 n 的数组中随机分布 (sparsity * n) 个 'true' 值,其中 sparsity 是活动位的百分比。
- INTVECTOR.RAND 从均匀分布 U(min,max) 中抽取 n 个样本。
- FLOATVECTOR.RAND 从正态分布 N(mu,sig) 中抽取 n 个样本。
-
向量长度不必匹配。算术运算在重叠部分逐元素执行。偏移参数将堆栈顶部的向量移位以创建所需的重叠。
-
在 Push 程序中,向量定义为 BOOL[..], FLOAT[..] 和 INT[..]。例如,BOOL[1,0] 定义了一个具有两个元素的 BOOLVECTOR。
用法
以下示例显示了如何使用 Prush 解释 Push 程序。
// Define Push program
let input = "( CODE.QUOTE ( CODE.DUP INTEGER.DUP 1 INTEGER.- CODE.DO INTEGER.* )
CODE.QUOTE ( INTEGER.POP 1 )
INTEGER.DUP 2 INTEGER.< CODE.IF )";
// Define State and Instruction Set
let mut push_state = PushState::new();
let mut instruction_set = InstructionSet::new();
// Load default instructions
instruction_set.load();
// Add program to execution stack
PushParser::parse_program(&mut push_state, &instruction_set, &input);
// Put initial values
push_state.int_stack.push(4);
// Run the program
PushInterpreter::run(&mut push_state, &mut instruction_set);
对于现有类型,可以通过调用 add
函数扩展指令集。
pub fn my_instruction(_push_state: &mut PushState, _instruction_set: &InstructionCache) {
// Does nothing
}
...
let mut instruction_set = InstructionSet::new();
instruction_set.add(String::from("MyInstruction"), Instruction::new(my_instruction));
依赖项
~1–1.4MB
~24K SLoC