dxf
2024-10-12 01:45:10 UTC
The basics:
: .BAD ( -- ) cr ." Invalid item" .abort ;
: ZE? ( x -- ) if .bad then ; \ abort if non-zero
: NZ? ( x -- ) 0= ze? ; \ abort if zero
: ?ZE ( x -- x ) dup ze? ; \ check x is zero
: ?NZ ( x -- x ) dup nz? ; \ check x is non-zero
Examples:
: ?D>S ( d|ud -- n|u ) -1 0 between nz? ;
: ?RNG ( n|u lo hi -- n|u ) rot dup 2swap between nz? ;
\ Single number parsers with checking
: /DNUM ( a u -- a' 0 d|ud )
/sign >r ?nz (number) ?ze 2swap r> if dnegate then ;
: /NUM ( a u -- a' 0 n|u ) /dnum ?d>s ;
: /HEX ( a u -- a' 0 n|u ) base @ >r hex /num r> base ! ;
\ String to unsigned int with checking
: >INT ( a u -- u2 ) ?nz (number) ?ze 2drop ze? ;
where
: (NUMBER) ( a u -- ud a' u' ) 0 0 2swap >number ;
: /SIGN ( a u -- a' u' f )
dup if over c@ dup [char] + = swap [char] - =
dup >r or negate /string r> exit then 0 ;
: .BAD ( -- ) cr ." Invalid item" .abort ;
: ZE? ( x -- ) if .bad then ; \ abort if non-zero
: NZ? ( x -- ) 0= ze? ; \ abort if zero
: ?ZE ( x -- x ) dup ze? ; \ check x is zero
: ?NZ ( x -- x ) dup nz? ; \ check x is non-zero
Examples:
: ?D>S ( d|ud -- n|u ) -1 0 between nz? ;
: ?RNG ( n|u lo hi -- n|u ) rot dup 2swap between nz? ;
\ Single number parsers with checking
: /DNUM ( a u -- a' 0 d|ud )
/sign >r ?nz (number) ?ze 2swap r> if dnegate then ;
: /NUM ( a u -- a' 0 n|u ) /dnum ?d>s ;
: /HEX ( a u -- a' 0 n|u ) base @ >r hex /num r> base ! ;
\ String to unsigned int with checking
: >INT ( a u -- u2 ) ?nz (number) ?ze 2drop ze? ;
where
: (NUMBER) ( a u -- ud a' u' ) 0 0 2swap >number ;
: /SIGN ( a u -- a' u' f )
dup if over c@ dup [char] + = swap [char] - =
dup >r or negate /string r> exit then 0 ;