8个不稳定版本 (3个重大变更)

0.4.0 2019年12月29日
0.3.0 2019年11月20日
0.2.0 2019年10月19日
0.1.4 2019年9月22日

编程语言 中排名 569

MIT 协议

775KB
21K SLoC

Build Status

SMPL

S(ome) M(ore) P(rogramming) L(anguage),发音为 'simple'。

这是什么?

SMPL是一种简单的静态类型编程语言,旨在易于嵌入到 Rust 中并编写独立程序。

动机

SMPL被构建来替换我的选择自己的冒险引擎 CYOA 的脚本语言 Popstcl

优点

  • Rust-like 语法。
  • 静态类型
  • 词法作用域
  • 具有Rust代码生成器的编译器
  • 可嵌入的(异步)解释器
  • 函数管道
  • 基于宽度的结构化子类型
  • 泛型(具有基于宽度的结构化约束)

缺点

  • 不完全匹配Rust 1:1
    • 没有移动语义
    • 没有生命周期概念
  • 基础标准库

使用代码

项目分为两部分

  • smpl
    • 定义语言的内核crate
    • 包括
      • 解析器
      • 静态分析器
      • 字节码数据结构
      • 字节码生成器
      • 元数据收集器
  • smpli
    • smpl字节码的解释器
      • 从解析和分析的SMPL模块创建AVM
      • 为SMPL函数启动指令执行器
      • 提供映射Rust -> SMPL(内建)函数的接口
    • 运行时数据结构

示例

有关更多嵌入示例,请参阅 examples/tic-tac-toe

SMPL代码

// In a file or as a String
mod test;

// From interpreter's stdlib 
use log;

struct Point3d {
    x: int,
    y: int,
    z: int,
}

fn modify2d(type P)(point: P, x: int, y: int) -> P 
    where P: { x: int, y: int } {

    point.x = x;
    point.y = y;

    return point;
}

fn getX(point: { x: int }) -> int {
    return point.x;
}

fn add(l: int, r: int) -> int {
    return l + r;
}

fn main() {
    let p = init Point {
        x: 0,
        y: 0,
        z: 0,
    };

    let p = modify2d(type Point)(p, 1, 2);

    // Should print '4'
    log::println(add(getX(p), 1) |> add(2));
}

Rust代码

// Running the above SMPL code using the 'smpli' crate
let scripts = vec![
    // If you have a path, can use:
    //   parse_module(UnparsedModule::file(path, &str_buff))
    VmModule::new(
      parse_module(UnparsedModule::anonymous(module_string))
        .unwrap()
    )
];

let std = StdBuilder::default().log(true).build().unwrap();
let vm = AVM::new(std, scripts)?;

let fn_handle = vm.query_module("rt", "run").unwrap().unwrap(); 
let executor = match vm
    .spawn_executor(fn_handle, None, SpawnOptions {
        type_check: false
    }) {

    Ok(executor) => executor,

    Err(e) => {
        println!("{:?}", e);
        process::exit(1);
    }

};

let _result = match executor.execute_sync() {

    Ok(val) => val,

    Err(e) => {
        println!("{:?}", e);
    }
};

运行SMPL代码。

Rust后端暂时不支持。

SMPL旨在嵌入到其他Rust程序中。解释器是保证支持所有现有和未来语言功能的SMPL代码执行的唯一方法。

许可证

MIT许可证 下发布(见LICENSE-MIT)。

依赖项

~9.5MB
~166K SLoC