#tcl #tea #rust

rtea

使 Rust 编写 Tcl 扩展变得舒适

3 个不稳定版本

0.2.0 2022 年 2 月 5 日
0.1.1 2021 年 11 月 14 日
0.1.0 2021 年 11 月 14 日

#7 in #tea

MIT/Apache

60KB
1K SLoC

Rust Tcl 扩展架构 (rtea)

使 Rust 编写 Tcl 扩展变得舒适。


lib.rs:

rtea 尝试成为 Rust 的 TEA (Tcl 扩展架构)。

该库提供了围绕 Tcl 模拟实现所需包装器,以便在不使用不安全代码的情况下编写“rusty”的 Tcl 扩展。

示例

以下示例假设您在一个具有 cdylib 目标的项目的根目录中,并包含以下两个文件。如果您执行

cargo build
tclsh example.tcl

则应看到以下输出

Hello, world!
Hello from Rust!

src/lib.rs

use rtea::*;

#[module_init(Example, "1.0.0")]
fn init(interp: &Interpreter) -> Result<TclStatus, String> {
    interp.create_command("example", example)
}

fn example(interp: &Interpreter, args: Vec<&str>) -> Result<TclStatus, String> {
    interp.eval("puts {Hello, world!}").map_err(|e| e.get_string().to_string())?;
    interp.set_result("Hello from Rust!");
    Ok(TclStatus::Ok)
}

example.tcl

load ./target/debug/libexample.so
puts [example]

上面的 Tcl 代码使用 load 仅用于显示该模块可以正确地与 Tcl 交互。生产使用应将共享对象包装为 Tcl 软件包,并使用 package require example 加载它。已通过 module_init 宏处理注册“example”软件包。

注意

此代码假定它扩展了 Tcl,并将任何违反 Tcl API(意外的空指针、非 UTF8 字符串等)视为不可恢复的错误,应引发恐慌。

依赖项