diff --git a/crates/core/boot.fth b/crates/core/boot.fth index 2644aac..83162ea 100644 --- a/crates/core/boot.fth +++ b/crates/core/boot.fth @@ -72,6 +72,19 @@ 1- REPEAT ; +\ --------------------------------------------------------------- +\ Common extensions (not in Forth 2012, gforth-compatible) +\ --------------------------------------------------------------- + +\ -ROT ( x1 x2 x3 -- x3 x1 x2 ) rotate top item to third place +: -ROT ROT ROT ; + +\ <= ( n1 n2 -- flag ) true if n1 <= n2 (signed) +: <= > 0= ; + +\ >= ( n1 n2 -- flag ) true if n1 >= n2 (signed) +: >= < 0= ; + \ --------------------------------------------------------------- \ Phase 2: Double-cell arithmetic \ --------------------------------------------------------------- diff --git a/crates/core/src/outer.rs b/crates/core/src/outer.rs index 71b7a35..71c5121 100644 --- a/crates/core/src/outer.rs +++ b/crates/core/src/outer.rs @@ -7462,6 +7462,12 @@ mod tests { assert_eq!(eval_stack("1 2 3 ROT"), vec![1, 3, 2]); } + #[test] + fn test_minus_rot() { + // ( 1 2 3 -- 3 1 2 ) top-first: [2, 1, 3] + assert_eq!(eval_stack("1 2 3 -ROT"), vec![2, 1, 3]); + } + // -- Comparison -- #[test] @@ -7482,6 +7488,20 @@ mod tests { assert_eq!(eval_stack("3 5 >"), vec![0]); } + #[test] + fn test_less_or_equal() { + assert_eq!(eval_stack("3 5 <="), vec![-1]); + assert_eq!(eval_stack("5 5 <="), vec![-1]); + assert_eq!(eval_stack("5 3 <="), vec![0]); + } + + #[test] + fn test_greater_or_equal() { + assert_eq!(eval_stack("5 3 >="), vec![-1]); + assert_eq!(eval_stack("5 5 >="), vec![-1]); + assert_eq!(eval_stack("3 5 >="), vec![0]); + } + // -- Logic -- #[test]