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 编程语言
25KB
304 行
fortraith
是什么?
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