[−][src]Crate fortraith
Compile-Time Compiler That Compiles Forth to Trait Expressions
"We all know Rust's trait system is Turing complete, so tell me, why aren't we exploiting this???" - Nathan Corbyn
#![recursion_limit = "256"] #[macro_use] extern crate fortraith; use fortraith::*; fn test_factorial() { forth!( : factorial (n -- n) 1 swap fact0 ; : fact0 (n n -- n) dup 1 = if drop else dup rot * swap pred fact0 then ; 5 factorial return type Out as top ); assert_eq!(Out::eval(), 120); }
This crate allows the user to exploit traits as much as wanted. It contains around 10% black trait magic, around 40% of the darkest kind of evil macro magic and around 50% of good quality docs (you are here!). Everything is tested and ready for production (a joke).
Although you might not want to really use it in production it serves to show how powerful
Rust's trait system and macro_rules!
really are.
If you are new to forth, it is a simple stack-based language. Every operation is done on the
stack and grabs and pushes values into it. For example 2 2 +
would push 2
to the top of the
stack 2 times, take and add them together and push the result back to the stack (So the stack
would have only 4
in it if it was empty before pushing the first 2
). Its simplicity makes
it a usual target for recreational implementation.
See documentation for traits and the macro to see many examples and learn how to use fortraith, and abuse the Rust's trait system!
"Ok, ok, all that's fine, but where is my FizzBuzz implementation?" you might ask. Fear not, as tradition dictates FizzBuzz is implemented in fortraith as well.
Macros
forth | Compile forth to trait expressions |
Traits
Eval |
|
and | Logical and two top elements |
drop | Remove the top element |
dup | Duplicate the top element |
eight | ( 8 ) Constant number |
eq | ( = ) Chech if two top elements are equal |
fact | Calculate the factorial of the top element |
falsef | ( false ) Constant boolean |
fib | Index the fibonacci sequence with the top element |
five | ( 5 ) Constant number |
four | ( 4 ) Constant number |
iff | ( if / else / then ) conditional expression |
less | ( < ) Check if the second top element is less than the top elements |
minus | ( - ) Subtract the top element from the second top element |
modulo | ( % ) Calculate the rest from dividing the second top element by the top element |
mult | ( * ) Multiply two top elemenents |
nine | ( 9 ) Constant number |
not | Apply logical not to the top element |
one | ( 1 ) Constant number |
or | Logical or two top elements |
plus | ( + ) Add two top elements together |
pred | Decrement the top element |
rot | Rotate three top elements |
seven | ( 7 ) Constant number |
six | ( 6 ) Constant number |
swap | Swap two top elements |
ten | ( 10 ) Constant number |
three | ( 3 ) Constant number |
top | Get the top element |
truef | ( true ) Constant boolean |
two | ( 2 ) Constant number |
zero | ( 0 ) Constant number |