Fix code for math.parser changes

db4
Slava Pestov 2008-02-06 21:15:47 -06:00
parent 7534d84d27
commit 2541c62e29
14 changed files with 23 additions and 20 deletions

View File

@ -33,6 +33,9 @@ IN: math.parser
: string>digits ( str -- digits ) : string>digits ( str -- digits )
[ digit> ] { } map-as ; [ digit> ] { } map-as ;
: digits>integer ( seq radix -- n )
0 swap [ swapd * + ] curry reduce ;
DEFER: base> DEFER: base>
<PRIVATE <PRIVATE
@ -52,9 +55,6 @@ SYMBOL: radix
"/" split1 (base>) >r whole-part r> "/" split1 (base>) >r whole-part r>
3dup and and [ / + ] [ 3drop f ] if ; 3dup and and [ / + ] [ 3drop f ] if ;
: digits>integer ( seq -- n )
0 radix get [ swapd * + ] curry reduce ;
: valid-digits? ( seq -- ? ) : valid-digits? ( seq -- ? )
{ {
{ [ dup empty? ] [ drop f ] } { [ dup empty? ] [ drop f ] }
@ -64,7 +64,7 @@ SYMBOL: radix
: string>integer ( str -- n/f ) : string>integer ( str -- n/f )
string>digits dup valid-digits? string>digits dup valid-digits?
[ digits>integer ] [ drop f ] if ; [ radix get digits>integer ] [ drop f ] if ;
PRIVATE> PRIVATE>

View File

@ -47,11 +47,13 @@ ARTICLE: "syntax-integers" "Integer syntax"
"More information on integers can be found in " { $link "integers" } "." ; "More information on integers can be found in " { $link "integers" } "." ;
ARTICLE: "syntax-ratios" "Ratio syntax" ARTICLE: "syntax-ratios" "Ratio syntax"
"The printed representation of a ratio is a pair of integers separated by a slash (/). No intermediate whitespace is permitted. Either integer may be signed, however the ratio will be normalized into a form where the denominator is positive and the greatest common divisor of the two terms is 1." "The printed representation of a ratio is a pair of integers separated by a slash (/), prefixed by an optional whole number part followed by a plus (+). No intermediate whitespace is permitted. Here are some examples:"
{ $code { $code
"75/33" "75/33"
"1/10" "1/10"
"-5/-6" "-5/-6"
"1+1/3"
"-10+1/7"
} }
"More information on ratios can be found in " { $link "rationals" } ; "More information on ratios can be found in " { $link "rationals" } ;

2
extra/json/reader/reader.factor Normal file → Executable file
View File

@ -104,7 +104,7 @@ LAZY: 'digit1-9' ( -- parser )
LAZY: 'digit0-9' ( -- parser ) LAZY: 'digit0-9' ( -- parser )
[ digit? ] satisfy [ digit> ] <@ ; [ digit? ] satisfy [ digit> ] <@ ;
: decimal>integer ( seq -- num ) 10 swap digits>integer ; : decimal>integer ( seq -- num ) 10 digits>integer ;
LAZY: 'int' ( -- parser ) LAZY: 'int' ( -- parser )
'zero' 'zero'

View File

@ -7,6 +7,7 @@ ARTICLE: "rationals" "Rational numbers"
"When we add, subtract or multiply any two integers, the result is always an integer. However, dividing a numerator by a denominator that is not an integral divisor of the denominator yields a ratio:" "When we add, subtract or multiply any two integers, the result is always an integer. However, dividing a numerator by a denominator that is not an integral divisor of the denominator yields a ratio:"
{ $example "1210 11 / ." "110" } { $example "1210 11 / ." "110" }
{ $example "100 330 / ." "10/33" } { $example "100 330 / ." "10/33" }
{ $example "14 10 / ." "1+2/5" }
"Ratios are printed and can be input literally in the form above. Ratios are always reduced to lowest terms by factoring out the greatest common divisor of the numerator and denominator. A ratio with a denominator of 1 becomes an integer. Division with a denominator of 0 throws an error." "Ratios are printed and can be input literally in the form above. Ratios are always reduced to lowest terms by factoring out the greatest common divisor of the numerator and denominator. A ratio with a denominator of 1 becomes an integer. Division with a denominator of 0 throws an error."
$nl $nl
"Ratios behave just like any other number -- all numerical operations work as you would expect." "Ratios behave just like any other number -- all numerical operations work as you would expect."

2
extra/math/text/english/english.factor Normal file → Executable file
View File

@ -33,7 +33,7 @@ SYMBOL: and-needed?
: 3digit-groups ( n -- seq ) : 3digit-groups ( n -- seq )
number>string <reversed> 3 <groups> number>string <reversed> 3 <groups>
[ reverse 10 string>integer ] map ; [ reverse string>number ] map ;
: hundreds-place ( n -- str ) : hundreds-place ( n -- str )
100 /mod swap dup zero? [ 100 /mod swap dup zero? [

View File

@ -8,7 +8,7 @@ IN: parser-combinators.simple
[ digit? ] satisfy [ digit> ] <@ ; [ digit? ] satisfy [ digit> ] <@ ;
: 'integer' ( -- parser ) : 'integer' ( -- parser )
'digit' <!+> [ 10 swap digits>integer ] <@ ; 'digit' <!+> [ 10 digits>integer ] <@ ;
: 'string' ( -- parser ) : 'string' ( -- parser )
[ CHAR: " = ] satisfy [ CHAR: " = ] satisfy

2
extra/peg/peg.factor Normal file → Executable file
View File

@ -343,7 +343,7 @@ MEMO: 'digit' ( -- parser )
[ digit? ] satisfy [ digit> ] action ; [ digit? ] satisfy [ digit> ] action ;
MEMO: 'integer' ( -- parser ) MEMO: 'integer' ( -- parser )
'digit' repeat1 [ 10 swap digits>integer ] action ; 'digit' repeat1 [ 10 digits>integer ] action ;
MEMO: 'string' ( -- parser ) MEMO: 'string' ( -- parser )
[ [

2
extra/project-euler/024/024.factor Normal file → Executable file
View File

@ -23,7 +23,7 @@ IN: project-euler.024
! -------- ! --------
: euler024 ( -- answer ) : euler024 ( -- answer )
999999 10 permutation 10 swap digits>integer ; 999999 10 permutation 10 digits>integer ;
! [ euler024 ] 100 ave-time ! [ euler024 ] 100 ave-time
! 0 ms run / 0 ms GC ave time - 100 trials ! 0 ms run / 0 ms GC ave time - 100 trials

10
extra/project-euler/032/032.factor Normal file → Executable file
View File

@ -27,21 +27,21 @@ IN: project-euler.032
<PRIVATE <PRIVATE
: source-032 ( -- seq ) : source-032 ( -- seq )
9 factorial [ 9 permutation [ 1+ ] map 10 swap digits>integer ] map ; 9 factorial [ 9 permutation [ 1+ ] map 10 digits>integer ] map ;
: 1and4 ( n -- ? ) : 1and4 ( n -- ? )
number>string 1 cut-slice 4 cut-slice number>string 1 cut-slice 4 cut-slice
[ 10 string>integer ] 3apply [ * ] dip = ; [ string>number ] 3apply [ * ] dip = ;
: 2and3 ( n -- ? ) : 2and3 ( n -- ? )
number>string 2 cut-slice 3 cut-slice number>string 2 cut-slice 3 cut-slice
[ 10 string>integer ] 3apply [ * ] dip = ; [ string>number ] 3apply [ * ] dip = ;
: valid? ( n -- ? ) : valid? ( n -- ? )
dup 1and4 swap 2and3 or ; dup 1and4 swap 2and3 or ;
: products ( seq -- m ) : products ( seq -- m )
[ number>string 4 tail* 10 string>integer ] map ; [ number>string 4 tail* string>number ] map ;
PRIVATE> PRIVATE>
@ -65,7 +65,7 @@ PRIVATE>
! multiplicand/multiplier/product ! multiplicand/multiplier/product
: mmp ( pair -- n ) : mmp ( pair -- n )
first2 2dup * [ number>string ] 3apply 3append 10 string>integer ; first2 2dup * [ number>string ] 3apply 3append string>number ;
PRIVATE> PRIVATE>

2
extra/project-euler/035/035.factor Normal file → Executable file
View File

@ -38,7 +38,7 @@ IN: project-euler.035
: (circular?) ( seq n -- ? ) : (circular?) ( seq n -- ? )
dup 0 > [ dup 0 > [
2dup rotate 10 swap digits>integer 2dup rotate 10 digits>integer
prime? [ 1- (circular?) ] [ 2drop f ] if prime? [ 1- (circular?) ] [ 2drop f ] if
] [ ] [
2drop t 2drop t

2
extra/project-euler/037/037.factor Normal file → Executable file
View File

@ -32,7 +32,7 @@ IN: project-euler.037
] if ; ] if ;
: reverse-digits ( n -- m ) : reverse-digits ( n -- m )
number>string reverse 10 string>integer ; number>string reverse string>number ;
: l-trunc? ( n -- ? ) : l-trunc? ( n -- ? )
reverse-digits 10 /i reverse-digits dup 0 > [ reverse-digits 10 /i reverse-digits dup 0 > [

2
extra/project-euler/038/038.factor Normal file → Executable file
View File

@ -36,7 +36,7 @@ IN: project-euler.038
: (concat-product) ( accum n multiplier -- m ) : (concat-product) ( accum n multiplier -- m )
pick length 8 > [ pick length 8 > [
2drop 10 swap digits>integer 2drop 10 digits>integer
] [ ] [
[ * number>digits over push-all ] 2keep 1+ (concat-product) [ * number>digits over push-all ] 2keep 1+ (concat-product)
] if ; ] if ;

2
extra/project-euler/040/040.factor Normal file → Executable file
View File

@ -37,7 +37,7 @@ IN: project-euler.040
SBUF" " clone 1 -rot (concat-upto) ; SBUF" " clone 1 -rot (concat-upto) ;
: nth-integer ( n str -- m ) : nth-integer ( n str -- m )
[ 1- ] dip nth 1string 10 string>integer ; [ 1- ] dip nth 1string string>number ;
PRIVATE> PRIVATE>

2
extra/random-tester/safe-words/safe-words.factor Normal file → Executable file
View File

@ -16,7 +16,7 @@ IN: random-tester.safe-words
array? integer? complex? value-ref? ref? key-ref? array? integer? complex? value-ref? ref? key-ref?
interval? number? interval? number?
wrapper? tuple? wrapper? tuple?
[-1,1]? between? bignum? both? either? eq? equal? even? fixnum? float? fp-nan? hashtable? interval-contains? interval-subset? interval? key-ref? key? number? odd? pair? power-of-2? ratio? rational? real? subassoc? valid-digits? zero? assoc? curry? vector? callstack? ! clear 3.14 [ <vector> assoc? ] compile-1 [-1,1]? between? bignum? both? either? eq? equal? even? fixnum? float? fp-nan? hashtable? interval-contains? interval-subset? interval? key-ref? key? number? odd? pair? power-of-2? ratio? rational? real? subassoc? zero? assoc? curry? vector? callstack? ! clear 3.14 [ <vector> assoc? ] compile-1
2^ not 2^ not
! arrays ! arrays
resize-array <array> resize-array <array>