tighten some screws in math.parser
parent
34027e46b6
commit
28f5347e71
|
@ -5,39 +5,18 @@ strings arrays combinators splitting math assocs byte-arrays make ;
|
||||||
IN: math.parser
|
IN: math.parser
|
||||||
|
|
||||||
: digit> ( ch -- n )
|
: digit> ( ch -- n )
|
||||||
H{
|
127 bitand {
|
||||||
{ CHAR: 0 0 }
|
{ [ dup CHAR: 9 <= ] [ CHAR: 0 - ] }
|
||||||
{ CHAR: 1 1 }
|
{ [ dup CHAR: a < ] [ CHAR: A 10 - - ] }
|
||||||
{ CHAR: 2 2 }
|
[ CHAR: a 10 - - ]
|
||||||
{ CHAR: 3 3 }
|
} cond
|
||||||
{ CHAR: 4 4 }
|
dup 0 < [ drop 255 ] [ dup 16 >= [ drop 255 ] when ] if ; inline
|
||||||
{ CHAR: 5 5 }
|
|
||||||
{ CHAR: 6 6 }
|
|
||||||
{ CHAR: 7 7 }
|
|
||||||
{ CHAR: 8 8 }
|
|
||||||
{ CHAR: 9 9 }
|
|
||||||
{ CHAR: A 10 }
|
|
||||||
{ CHAR: B 11 }
|
|
||||||
{ CHAR: C 12 }
|
|
||||||
{ CHAR: D 13 }
|
|
||||||
{ CHAR: E 14 }
|
|
||||||
{ CHAR: F 15 }
|
|
||||||
{ CHAR: a 10 }
|
|
||||||
{ CHAR: b 11 }
|
|
||||||
{ CHAR: c 12 }
|
|
||||||
{ CHAR: d 13 }
|
|
||||||
{ CHAR: e 14 }
|
|
||||||
{ CHAR: f 15 }
|
|
||||||
{ CHAR: , f }
|
|
||||||
} at* [ drop 255 ] unless ; inline
|
|
||||||
|
|
||||||
: string>digits ( str -- digits )
|
: string>digits ( str -- digits )
|
||||||
[ digit> ] B{ } map-as ; inline
|
[ digit> ] B{ } map-as ; inline
|
||||||
|
|
||||||
: (digits>integer) ( valid? accum digit radix -- valid? accum )
|
: (digits>integer) ( valid? accum digit radix -- valid? accum )
|
||||||
over [
|
2dup < [ swapd * + ] [ 2drop 2drop f 0 ] if ; inline
|
||||||
2dup < [ swapd * + ] [ 2drop 2drop f 0 ] if
|
|
||||||
] [ 2drop ] if ; inline
|
|
||||||
|
|
||||||
: each-digit ( seq radix quot -- n/f )
|
: each-digit ( seq radix quot -- n/f )
|
||||||
[ t 0 ] 3dip curry each swap [ drop f ] unless ; inline
|
[ t 0 ] 3dip curry each swap [ drop f ] unless ; inline
|
||||||
|
@ -54,8 +33,8 @@ SYMBOL: negative?
|
||||||
|
|
||||||
: string>natural ( seq radix -- n/f )
|
: string>natural ( seq radix -- n/f )
|
||||||
over empty? [ 2drop f ] [
|
over empty? [ 2drop f ] [
|
||||||
[ [ digit> ] dip (digits>integer) ] each-digit
|
[ over CHAR: , eq? [ 2drop ] [ [ digit> ] dip (digits>integer) ] if ] each-digit
|
||||||
] if ; inline
|
] if ;
|
||||||
|
|
||||||
: sign ( -- str ) negative? get "-" "+" ? ;
|
: sign ( -- str ) negative? get "-" "+" ? ;
|
||||||
|
|
||||||
|
@ -116,13 +95,23 @@ SYMBOL: negative?
|
||||||
: number-char? ( char -- ? )
|
: number-char? ( char -- ? )
|
||||||
"0123456789ABCDEFabcdef." member? ; inline
|
"0123456789ABCDEFabcdef." member? ; inline
|
||||||
|
|
||||||
|
: last-unsafe ( seq -- elt )
|
||||||
|
[ length 1 - ] [ nth-unsafe ] bi ; inline
|
||||||
|
|
||||||
: numeric-looking? ( str -- ? )
|
: numeric-looking? ( str -- ? )
|
||||||
"-" ?head drop
|
|
||||||
dup empty? [ drop f ] [
|
dup empty? [ drop f ] [
|
||||||
dup first number-char? [
|
dup first-unsafe number-char? [
|
||||||
last number-char?
|
last-unsafe number-char?
|
||||||
] [ drop f ] if
|
] [
|
||||||
] if ;
|
dup first-unsafe CHAR: - eq? [
|
||||||
|
dup length 1 eq? [ drop f ] [
|
||||||
|
1 over nth-unsafe number-char? [
|
||||||
|
last-unsafe number-char?
|
||||||
|
] [ drop f ] if
|
||||||
|
] if
|
||||||
|
] [ drop f ] if
|
||||||
|
] if
|
||||||
|
] if ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue