fix WITHIN to match ANS FORTH (low ≤ test < high)
This commit is contained in:
parent
63b0c745ab
commit
e7dacc5582
17
startup.4th
17
startup.4th
|
|
@ -664,6 +664,9 @@ DEFER THROW-UNWIND ( k*x n -- i*x <noreturn> )
|
||||||
\ Return -1, 0, or 1 if n is respectively negative, zero, or positive
|
\ Return -1, 0, or 1 if n is respectively negative, zero, or positive
|
||||||
: SIGNUM ( n -- -1 | 0 | 1 ) DUP 0<= SWAP 0>= - ;
|
: 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
|
\ Double-cell versions of standard numeric words
|
||||||
: DABS ( d -- +d ) 2DUP D0< IF DNEGATE THEN ;
|
: DABS ( d -- +d ) 2DUP D0< IF DNEGATE THEN ;
|
||||||
: DMIN ( d1 d2 -- d1|d2 ) 2OVER 2OVER D> IF 2SWAP THEN 2DROP ;
|
: 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
|
- ?DUP IF -ROT 2>R NIP 2R> LEAVE THEN
|
||||||
LOOP ▪ 2DROP SIGNUM ;
|
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
|
\ Convert a character to lowercase or uppercase, respectively
|
||||||
: TO-LOWER ( ch1 -- ch2 )
|
: 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 )
|
: 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
|
\ If ch is a digit (any base) return the value in range [0, 36) and TRUE
|
||||||
\ Otherwise just return FALSE
|
\ Otherwise just return FALSE
|
||||||
: >DIGIT ( ch -- u TRUE | FALSE )
|
: >DIGIT ( ch -- u TRUE | FALSE )
|
||||||
DUP [CHAR] 0 [CHAR] 9 WITHIN IF [CHAR] 0 - TRUE EXIT THEN
|
DUP [CHAR] 0 [[ CHAR 9 1+ ]] 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 1+ ]] WITHIN IF [[ CHAR A 10 - ]] - TRUE EXIT THEN
|
||||||
DUP [CHAR] a [CHAR] z WITHIN IF [[ CHAR a 10 - ]] - TRUE EXIT THEN
|
DUP [CHAR] a [[ CHAR z 1+ ]] WITHIN IF [[ CHAR a 10 - ]] - TRUE EXIT THEN
|
||||||
DROP FALSE ;
|
DROP FALSE ;
|
||||||
|
|
||||||
\ Convert a string in the given base to an unsigned double-cell number
|
\ Convert a string in the given base to an unsigned double-cell number
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue