diff --git a/startup.4th b/startup.4th index e382bd1..4aa3c46 100644 --- a/startup.4th +++ b/startup.4th @@ -664,6 +664,9 @@ DEFER THROW-UNWIND ( k*x n -- i*x ) \ Return -1, 0, or 1 if n is respectively negative, zero, or positive : SIGNUM ( n -- -1 | 0 | 1 ) DUP 0<= SWAP 0>= - ; +\ True if n1 >= n2 && n1 <= n3, false otherwise +: WITHIN ( n1|u1 n2|u2 n3|u3 -- flag ) OVER - -ROT - U> ; + \ Double-cell versions of standard numeric words : DABS ( d -- +d ) 2DUP D0< IF DNEGATE THEN ; : DMIN ( d1 d2 -- d1|d2 ) 2OVER 2OVER D> IF 2SWAP THEN 2DROP ; @@ -990,22 +993,18 @@ CREATE LEAVE-ORIG NULL , - ?DUP IF -ROT 2>R NIP 2R> LEAVE THEN LOOP ▪ 2DROP SIGNUM ; -\ True if n1 >= n2 && n1 <= n3, false otherwise -: WITHIN ( n1|u1 n2|u2 n3|u3 -- flag ) - OVER - -ROT - U>= ; - \ Convert a character to lowercase or uppercase, respectively : TO-LOWER ( ch1 -- ch2 ) - DUP [CHAR] A [CHAR] Z WITHIN IF [[ CHAR a CHAR A - ]] + THEN ; + DUP [CHAR] A [[ CHAR Z 1+ ]] WITHIN IF [[ CHAR a CHAR A - ]] + THEN ; : TO-UPPER ( ch1 -- ch2 ) - DUP [CHAR] a [CHAR] z WITHIN IF [[ CHAR a CHAR A - ]] - THEN ; + DUP [CHAR] a [[ CHAR z 1+ ]] WITHIN IF [[ CHAR a CHAR A - ]] - THEN ; \ If ch is a digit (any base) return the value in range [0, 36) and TRUE \ Otherwise just return FALSE : >DIGIT ( ch -- u TRUE | FALSE ) - DUP [CHAR] 0 [CHAR] 9 WITHIN IF [CHAR] 0 - TRUE EXIT THEN - DUP [CHAR] A [CHAR] Z WITHIN IF [[ CHAR A 10 - ]] - TRUE EXIT THEN - DUP [CHAR] a [CHAR] z WITHIN IF [[ CHAR a 10 - ]] - TRUE EXIT THEN + DUP [CHAR] 0 [[ CHAR 9 1+ ]] WITHIN IF [CHAR] 0 - TRUE EXIT THEN + DUP [CHAR] A [[ CHAR Z 1+ ]] WITHIN IF [[ CHAR A 10 - ]] - TRUE EXIT THEN + DUP [CHAR] a [[ CHAR z 1+ ]] WITHIN IF [[ CHAR a 10 - ]] - TRUE EXIT THEN DROP FALSE ; \ Convert a string in the given base to an unsigned double-cell number