#编译时 #特性 #评估器 #常量 #讽刺

fortraith

编译时编译器,将Forth编译为编译时特性表达式

4个版本

0.1.3 2020年6月12日
0.1.2 2020年6月12日
0.1.1 2020年6月12日
0.1.0 2020年6月12日

#383 in 编程语言

MIT 许可证

25KB
304

fortraith

Docs.rs Crates.io 构建状态 编译时编译器,将Forth编译为编译时特性表达式。

是什么?

Rust的特性系统是图灵完备的。这个crate使用来自trait-eval的原则来实现Forth评估所需的特性,并提供了一个forth!宏,该宏将Forth的语法转译为特性表达式。

给我看看!

这里是一个简单的阶乘实现,这里唯一非标准的单词是pred,它是递减运算符,相当于1 -

forth!(
    : factorial (n -- n) 1 swap fact0 ;
    : fact0 (n n -- n) dup 1 = if drop else dup rot * swap pred fact0 then ;
    5 factorial .
);

这将打印120。正如你所见,不仅你可以轻松定义函数,甚至条件递归也是可能的!现在来看看它编译为特性表达式的样子(由cargo expand提供)

pub trait factorial {
   type Result;
}
impl<V, N> factorial for Node<V, N>
where
    Self: one,
    <Self as one>::Result: swap,
    <<Self as one>::Result as swap>::Result: fact0,
{
    type Result = <<<Self as one>::Result as swap>::Result as fact0>::Result;
}
pub trait fact0 {
    type Result;
}
impl <V ,N> fact0 for Node <V ,N>
where
    Self: dup,
    <Self as dup>::Result: one,
    <<Self as dup>::Result as one>::Result: eq,
    <<<Self as dup>::Result as one>::Result as eq>::Result: iff,
    <<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result: drop,
    <<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result: elsef,
    <<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result: dup,
    <<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result: rot,
    <<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result: mult,
    <<<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result as mult>::Result: swap,
    <<<<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result as mult>::Result as swap>::Result: pred,
    <<<<<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result as mult>::Result as swap>::Result as pred>::Result: fact0,
    <<<<<<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result as mult>::Result as swap>::Result as pred>::Result as fact0>::Result: then
{
    type Result = <<<<<<<<<<<<<Self as dup>::Result as one>::Result as eq>::Result as iff>::Result as drop>::Result as elsef>::Result as dup>::Result as rot>::Result as mult>::Result as swap>::Result as pred>::Result as fact0>::Result as then>::Result;
}
println!("{}", <<<Empty as five>::Result as factorial>::Result as top>::Result::eval());

是的,手动编写它会很无聊。

我能用它做什么?

实际上支持的特性很多,如上所示。从trait-eval中的每个操作都重新导出到栈上使用(除了if,它是用不同的方式做的),并提供了一些额外的栈操作。有关详细信息,请参阅文档

依赖项

~20KB