#解释器 #push #进化 #遗传 #栈式 #编程语言

bin+lib pushr

Pushr 是一个基于 Rust 的 Push 程序的解析器

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编程语言

MIT 许可证

435KB
10K SLoC

Pushr

example workflow

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