Merge git://spitspat.com/git/factor
commit
c078621369
|
@ -58,3 +58,5 @@ IN: temporary
|
|||
[ dup array? ] [ dup vector? ] [ dup float? ]
|
||||
} || nip
|
||||
] unit-test
|
||||
|
||||
[ 1 2 3 4 ] [ { 1 2 3 4 } 4 nfirst ] unit-test
|
||||
|
|
|
@ -67,6 +67,12 @@ MACRO: napply ( n -- )
|
|||
|
||||
: map-with2 ( obj obj list quot -- newseq ) 2 map-withn ; inline
|
||||
|
||||
MACRO: nfirst ( n -- )
|
||||
[ [ swap nth ] curry [ keep ] curry ] map concat [ drop ] compose ;
|
||||
|
||||
: seq>stack ( seq -- )
|
||||
dup length nfirst ; inline
|
||||
|
||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
: sigma ( seq quot -- n ) [ rot slip + ] curry 0 swap reduce ;
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
USING: kernel math.constants ;
|
||||
IN: random-tester.databank
|
||||
|
||||
: databank ( -- array )
|
||||
{
|
||||
! V{ } H{ } V{ 3 } { 3 } { } "" "asdf"
|
||||
pi 1/0. -1/0. 0/0. [ ]
|
||||
f t "" 0 0.0 3.14 2 -3 -7 20 3/4 -3/4 1.2/3 3.5
|
||||
C{ 2 2 } C{ 1/0. 1/0. }
|
||||
} ;
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
USING: compiler continuations io kernel math namespaces
|
||||
prettyprint quotations random sequences vectors ;
|
||||
USING: random-tester.databank random-tester.safe-words ;
|
||||
IN: random-tester
|
||||
|
||||
SYMBOL: errored
|
||||
SYMBOL: before
|
||||
SYMBOL: after
|
||||
SYMBOL: quot
|
||||
TUPLE: random-tester-error ;
|
||||
|
||||
: setup-test ( #data #code -- data... quot )
|
||||
#! Variable stack effect
|
||||
>r [ databank random ] times r>
|
||||
[ drop \ safe-words get random ] map >quotation ;
|
||||
|
||||
: test-compiler ! ( data... quot -- ... )
|
||||
errored off
|
||||
dup quot set
|
||||
datastack clone >vector dup pop* before set
|
||||
[ call ] catch drop
|
||||
datastack clone after set
|
||||
clear
|
||||
before get [ ] each
|
||||
quot get [ compile-1 ] [ errored on ] recover ;
|
||||
|
||||
: do-test ! ( data... quot -- )
|
||||
.s flush test-compiler
|
||||
errored get [
|
||||
datastack after get 2dup = [
|
||||
2drop
|
||||
] [
|
||||
[ . ] each
|
||||
"--" print
|
||||
[ . ] each
|
||||
quot get .
|
||||
random-tester-error construct-empty throw
|
||||
] if
|
||||
] unless clear ;
|
||||
|
||||
: random-test1 ( #data #code -- )
|
||||
setup-test do-test ;
|
||||
|
||||
: random-test2 ( -- )
|
||||
3 2 setup-test do-test ;
|
0
unmaintained/random-tester/random.factor → extra/random-tester/random/random.factor
Normal file → Executable file
0
unmaintained/random-tester/random.factor → extra/random-tester/random/random.factor
Normal file → Executable file
|
@ -0,0 +1,117 @@
|
|||
USING: kernel namespaces sequences sorting vocabs ;
|
||||
USING: arrays assocs generic hashtables math math.intervals math.parser math.functions refs shuffle vectors words ;
|
||||
IN: random-tester.safe-words
|
||||
|
||||
: ?-words
|
||||
{
|
||||
delegate
|
||||
|
||||
/f
|
||||
|
||||
bits>float bits>double
|
||||
float>bits double>bits
|
||||
|
||||
>bignum >boolean >fixnum >float
|
||||
|
||||
array? integer? complex? value-ref? ref? key-ref?
|
||||
interval? number?
|
||||
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
|
||||
2^ not
|
||||
! arrays
|
||||
resize-array <array>
|
||||
! assocs
|
||||
(assoc-stack)
|
||||
new-assoc
|
||||
assoc-like
|
||||
<hashtable>
|
||||
all-integers? (all-integers?) ! hangs?
|
||||
assoc-push-if
|
||||
|
||||
(clone) assoc-clone-like ! SYMBOL: foo foo dup (clone) =
|
||||
} ;
|
||||
|
||||
: bignum-words
|
||||
{
|
||||
next-power-of-2 (next-power-of-2)
|
||||
times
|
||||
hashcode hashcode*
|
||||
} ;
|
||||
|
||||
: initialization-words
|
||||
{
|
||||
init-namespaces
|
||||
} ;
|
||||
|
||||
: stack-words
|
||||
{
|
||||
dup
|
||||
drop 2drop 3drop
|
||||
roll -roll 2swap
|
||||
|
||||
>r r>
|
||||
} ;
|
||||
|
||||
: method-words
|
||||
{
|
||||
method-def
|
||||
forget-word
|
||||
} ;
|
||||
|
||||
: stateful-words
|
||||
{
|
||||
counter
|
||||
gensym
|
||||
} ;
|
||||
|
||||
: foo-words
|
||||
{
|
||||
set-retainstack
|
||||
retainstack callstack
|
||||
datastack
|
||||
callstack>array
|
||||
} ;
|
||||
|
||||
: exit-words
|
||||
{
|
||||
call-clear die
|
||||
} ;
|
||||
|
||||
: bad-words ( -- array )
|
||||
[
|
||||
?-words %
|
||||
bignum-words %
|
||||
initialization-words %
|
||||
stack-words %
|
||||
method-words %
|
||||
stateful-words %
|
||||
exit-words %
|
||||
foo-words %
|
||||
] { } make ;
|
||||
|
||||
: safe-words ( -- array )
|
||||
bad-words {
|
||||
"alists" "arrays" "assocs" ! "bit-arrays" "byte-arrays"
|
||||
! "classes" "combinators" "compiler" "continuations"
|
||||
! "core-foundation" "definitions" "documents"
|
||||
! "float-arrays" "generic" "graphs" "growable"
|
||||
"hashtables" ! io.*
|
||||
"kernel" "math"
|
||||
"math.bitfields" "math.complex" "math.constants" "math.floats"
|
||||
"math.functions" "math.integers" "math.intervals" "math.libm"
|
||||
"math.parser" "math.ratios" "math.vectors"
|
||||
! "namespaces" "quotations" "sbufs"
|
||||
! "queues" "strings" "sequences"
|
||||
"vectors"
|
||||
! "words"
|
||||
} [ words ] map concat seq-diff natural-sort ;
|
||||
|
||||
safe-words \ safe-words set-global
|
||||
|
||||
! foo dup (clone) = .
|
||||
! foo dup clone = .
|
||||
! f [ byte-array>bignum assoc-clone-like ] compile-1
|
||||
! 2 3.14 [ construct-empty number= ] compile-1
|
||||
! 3.14 [ <vector> assoc? ] compile-1
|
||||
! -3 [ ] 2 [ byte-array>bignum denominator ] compile-1
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
USING: arrays assocs combinators.lib continuations kernel
|
||||
math math.functions namespaces quotations random sequences
|
||||
sequences.private shuffle ;
|
||||
|
||||
IN: random-tester.utils
|
||||
|
||||
: %chance ( n -- ? )
|
||||
100 random > ;
|
||||
|
||||
: 10% ( -- ? ) 10 %chance ;
|
||||
: 20% ( -- ? ) 20 %chance ;
|
||||
: 30% ( -- ? ) 30 %chance ;
|
||||
: 40% ( -- ? ) 40 %chance ;
|
||||
: 50% ( -- ? ) 50 %chance ;
|
||||
: 60% ( -- ? ) 60 %chance ;
|
||||
: 70% ( -- ? ) 70 %chance ;
|
||||
: 80% ( -- ? ) 80 %chance ;
|
||||
: 90% ( -- ? ) 90 %chance ;
|
||||
|
||||
: call-if ( quot ? -- ) [ call ] [ drop ] if ; inline
|
||||
|
||||
: with-10% ( quot -- ) 10% call-if ; inline
|
||||
: with-20% ( quot -- ) 20% call-if ; inline
|
||||
: with-30% ( quot -- ) 30% call-if ; inline
|
||||
: with-40% ( quot -- ) 40% call-if ; inline
|
||||
: with-50% ( quot -- ) 50% call-if ; inline
|
||||
: with-60% ( quot -- ) 60% call-if ; inline
|
||||
: with-70% ( quot -- ) 70% call-if ; inline
|
||||
: with-80% ( quot -- ) 80% call-if ; inline
|
||||
: with-90% ( quot -- ) 90% call-if ; inline
|
||||
|
||||
: random-hash-key keys random ;
|
||||
: random-hash-value [ random-hash-key ] keep at ;
|
||||
|
||||
: do-one ( seq -- ) random call ; inline
|
||||
|
||||
TUPLE: p-list seq max count count-vec ;
|
||||
|
||||
: reset-array ( seq -- )
|
||||
[ drop 0 ] over map-into ;
|
||||
|
||||
C: <p-list> p-list
|
||||
|
||||
: make-p-list ( seq n -- tuple )
|
||||
>r dup length [ 1- ] keep r>
|
||||
[ ^ 0 swap 2array ] keep
|
||||
0 <array> <p-list> ;
|
||||
|
||||
: inc-seq ( seq max -- )
|
||||
2dup [ < ] curry find-last over [
|
||||
nipd 1+ 2over swap set-nth
|
||||
1+ over length rot <slice> reset-array
|
||||
] [
|
||||
3drop reset-array
|
||||
] if ;
|
||||
|
||||
: inc-count ( tuple -- )
|
||||
[ p-list-count first2 >r 1+ r> 2array ] keep
|
||||
set-p-list-count ;
|
||||
|
||||
: (get-permutation) ( seq index-seq -- newseq )
|
||||
[ swap nth ] map-with ;
|
||||
|
||||
: get-permutation ( tuple -- seq )
|
||||
[ p-list-seq ] keep p-list-count-vec (get-permutation) ;
|
||||
|
||||
: p-list-next ( tuple -- seq/f )
|
||||
dup p-list-count first2 < [
|
||||
[
|
||||
[ get-permutation ] keep
|
||||
[ p-list-count-vec ] keep p-list-max
|
||||
inc-seq
|
||||
] keep inc-count
|
||||
] [
|
||||
drop f
|
||||
] if ;
|
||||
|
||||
: (permutations) ( tuple -- )
|
||||
dup p-list-next [ , (permutations) ] [ drop ] if* ;
|
||||
|
||||
: permutations ( seq n -- seq )
|
||||
make-p-list [ (permutations) ] { } make ;
|
||||
|
||||
: (each-permutation) ( tuple quot -- )
|
||||
over p-list-next [
|
||||
[ rot drop swap call ] 3keep
|
||||
drop (each-permutation)
|
||||
] [
|
||||
2drop
|
||||
] if* ; inline
|
||||
|
||||
: each-permutation ( seq n quot -- )
|
||||
>r make-p-list r> (each-permutation) ;
|
||||
|
||||
|
|
@ -250,7 +250,7 @@ update() {
|
|||
}
|
||||
|
||||
install_libraries() {
|
||||
sudo apt-get install libc6-dev libfreetype6-dev wget git-core git-doc libx11-dev glutg3-dev
|
||||
sudo apt-get install libc6-dev libfreetype6-dev wget git-core git-doc libx11-dev glutg3-dev rlwrap
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
REQUIRES: libs/lazy-lists libs/null-stream libs/shuffle ;
|
||||
PROVIDE: apps/random-tester
|
||||
{ +files+ {
|
||||
"utils.factor"
|
||||
"random.factor"
|
||||
"random-tester.factor"
|
||||
"random-tester2.factor"
|
||||
"type.factor"
|
||||
} } ;
|
|
@ -1,301 +0,0 @@
|
|||
USING: kernel math math-internals memory sequences namespaces errors
|
||||
assocs words arrays parser compiler syntax io
|
||||
quotations tools prettyprint optimizer inference ;
|
||||
IN: random-tester
|
||||
|
||||
! n-foo>bar -- list of words of type 'foo' that take n parameters
|
||||
! and output a 'bar'
|
||||
|
||||
|
||||
! Math vocabulary words
|
||||
: 1-x>y
|
||||
{
|
||||
1+ 1- >bignum >digit >fixnum abs absq arg
|
||||
bitnot bits>double bits>float ceiling cis conjugate cos cosec cosech
|
||||
cosh cot coth denominator double>bits exp float>bits floor imaginary
|
||||
log neg numerator real sec ! next-power-of-2
|
||||
sech sgn sin sinh sq sqrt tan tanh truncate
|
||||
} ;
|
||||
|
||||
: 1-x>y-throws
|
||||
{
|
||||
recip log2
|
||||
asec asech acot acoth acosec acosech acos acosh asin asinh atan atanh
|
||||
} ;
|
||||
|
||||
: 2-x>y ( -- seq ) { * + - /f max min polar> bitand bitor bitxor align } ;
|
||||
: 2-x>y-throws ( -- seq ) { / /i mod rem } ;
|
||||
|
||||
: 1-integer>x
|
||||
{
|
||||
1+ 1- >bignum >digit >fixnum abs absq arg
|
||||
bitnot bits>double bits>float ceiling cis conjugate cos cosec cosech
|
||||
cosh cot coth denominator exp floor imaginary
|
||||
log neg next-power-of-2 numerator real sec
|
||||
sech sgn sin sinh sq sqrt tan tanh truncate
|
||||
} ;
|
||||
|
||||
: 1-ratio>x
|
||||
{
|
||||
1+ 1- >bignum >digit >fixnum abs absq arg ceiling
|
||||
cis conjugate cos cosec cosech
|
||||
cosh cot coth exp floor imaginary
|
||||
log neg next-power-of-2 real sec
|
||||
sech sgn sin sinh sq sqrt tan tanh truncate
|
||||
} ;
|
||||
|
||||
: 1-float>x ( -- seq )
|
||||
{
|
||||
1+ 1- >bignum >digit >fixnum abs absq arg
|
||||
ceiling cis conjugate cos cosec cosech
|
||||
cosh cot coth double>bits exp float>bits floor imaginary
|
||||
log neg real sec ! next-power-of-2
|
||||
sech sgn sin sinh sq sqrt tan tanh truncate
|
||||
} ;
|
||||
|
||||
: 1-complex>x
|
||||
{
|
||||
1+ 1- abs absq arg conjugate cos cosec cosech
|
||||
cosh cot coth exp imaginary log neg real
|
||||
sec sech sin sinh sq sqrt tan tanh
|
||||
} ;
|
||||
|
||||
: 1-integer>x-throws
|
||||
{
|
||||
recip log2
|
||||
asec asech acot acoth acosec acosech acos acosh asin asinh atan atanh
|
||||
} ;
|
||||
|
||||
: 1-ratio>x-throws
|
||||
{
|
||||
recip
|
||||
asec asech acot acoth acosec acosech acos acosh asin asinh atan atanh
|
||||
} ;
|
||||
|
||||
: 1-integer>integer
|
||||
{
|
||||
1+ 1- >bignum >digit >fixnum abs absq bitnot ceiling conjugate
|
||||
denominator floor imaginary
|
||||
neg next-power-of-2 numerator real sgn sq truncate
|
||||
} ;
|
||||
|
||||
: 1-ratio>ratio
|
||||
{ 1+ 1- >digit abs absq conjugate neg real sq } ;
|
||||
|
||||
: 1-float>float
|
||||
{
|
||||
1+ 1- >digit abs absq arg ceiling
|
||||
conjugate exp floor neg real sq truncate
|
||||
} ;
|
||||
|
||||
: 1-complex>complex
|
||||
{
|
||||
1+ 1- abs absq arg conjugate cosec cosech cosh cot coth exp log
|
||||
neg sech sin sinh sq sqrt tanh
|
||||
} ;
|
||||
|
||||
: 2-integer>x { * + - /f max min polar> bitand bitor bitxor align } ;
|
||||
: 2-ratio>x { * + - /f max min polar> } ;
|
||||
: 2-float>x { float+ float- float* float/f + - * /f max min polar> } ;
|
||||
: 2-complex>x { * + - /f } ;
|
||||
|
||||
: 2-integer>integer { * + - max min bitand bitor bitxor align } ;
|
||||
: 2-ratio>ratio { * + - max min } ;
|
||||
: 2-float>float { float* float+ float- float/f max min /f + - } ;
|
||||
: 2-complex>complex { * + - /f } ;
|
||||
|
||||
|
||||
SYMBOL: last-quot
|
||||
SYMBOL: first-arg
|
||||
SYMBOL: second-arg
|
||||
: 0-runtime-check ( quot -- )
|
||||
#! Checks the runtime only, not the compiler
|
||||
#! Evaluates the quotation twice and makes sure the results agree
|
||||
[ last-quot set ] keep
|
||||
[ call ] keep
|
||||
call
|
||||
! 2dup swap unparse write " " write unparse print flush
|
||||
= [ last-quot get . "problem in runtime" throw ] unless ;
|
||||
|
||||
: 1-runtime-check ( quot -- )
|
||||
#! Checks the runtime only, not the compiler
|
||||
#! Evaluates the quotation twice and makes sure the results agree
|
||||
#! For quotations that are given one argument
|
||||
[ last-quot set first-arg set ] 2keep
|
||||
[ call ] 2keep
|
||||
call
|
||||
2dup swap unparse write " " write unparse print flush
|
||||
= [ "problem in runtime" throw ] unless ;
|
||||
|
||||
: 1-interpreted-vs-compiled-check ( x quot -- )
|
||||
#! Checks the runtime output vs the compiler output
|
||||
#! quot: ( x -- y )
|
||||
2dup swap unparse write " " write . flush
|
||||
[ last-quot set first-arg set ] 2keep
|
||||
[ call ] 2keep compile-1
|
||||
2dup swap unparse write " " write unparse print flush
|
||||
= [ "problem in math1" throw ] unless ;
|
||||
|
||||
: 2-interpreted-vs-compiled-check ( x y quot -- )
|
||||
#! Checks the runtime output vs the compiler output
|
||||
#! quot: ( x y -- z )
|
||||
.s flush
|
||||
[ last-quot set first-arg set second-arg set ] 3keep
|
||||
[ call ] 3keep compile-1
|
||||
2dup swap unparse write " " write unparse print flush
|
||||
= [ "problem in math2" throw ] unless ;
|
||||
|
||||
: 0-interpreted-vs-compiled-check-catch ( quot -- )
|
||||
#! Check the runtime output vs the compiler output for words that throw
|
||||
#!
|
||||
dup .
|
||||
[ last-quot set ] keep
|
||||
[ catch [ "caught: " write dup print-error ] when* ] keep
|
||||
[ compile-1 ] catch [ nip "caught: " write dup print-error ] when*
|
||||
= [ "problem in math3" throw ] unless ;
|
||||
|
||||
: 1-interpreted-vs-compiled-check-catch ( quot -- )
|
||||
#! Check the runtime output vs the compiler output for words that throw
|
||||
2dup swap unparse write " " write .
|
||||
! "." write
|
||||
[ last-quot set first-arg set ] 2keep
|
||||
[ catch [ nip "caught: " write dup print-error ] when* ] 2keep
|
||||
[ compile-1 ] catch [ 2nip "caught: " write dup print-error ] when*
|
||||
= [ "problem in math4" throw ] unless ;
|
||||
|
||||
: 2-interpreted-vs-compiled-check-catch ( quot -- )
|
||||
#! Check the runtime output vs the compiler output for words that throw
|
||||
! 3dup rot unparse write " " write swap unparse write " " write .
|
||||
"." write
|
||||
[ last-quot set first-arg set second-arg set ] 3keep
|
||||
[ catch [ 2nip "caught: " write dup print-error ] when* ] 3keep
|
||||
[ compile-1 ] catch [ 2nip nip "caught: " write dup print-error ] when*
|
||||
= [ "problem in math5" throw ] unless ;
|
||||
|
||||
|
||||
! RANDOM QUOTATIONS TO TEST
|
||||
: random-1-integer>x-quot ( -- quot ) 1-integer>x random 1quotation ;
|
||||
: random-1-ratio>x-quot ( -- quot ) 1-ratio>x random 1quotation ;
|
||||
: random-1-float>x-quot ( -- quot ) 1-float>x random 1quotation ;
|
||||
: random-1-complex>x-quot ( -- quot ) 1-complex>x random 1quotation ;
|
||||
|
||||
: test-1-integer>x ( -- )
|
||||
random-integer random-1-integer>x-quot 1-interpreted-vs-compiled-check ;
|
||||
: test-1-ratio>x ( -- )
|
||||
random-ratio random-1-ratio>x-quot 1-interpreted-vs-compiled-check ;
|
||||
: test-1-float>x ( -- )
|
||||
random-float random-1-float>x-quot 1-interpreted-vs-compiled-check ;
|
||||
: test-1-complex>x ( -- )
|
||||
random-complex random-1-complex>x-quot 1-interpreted-vs-compiled-check ;
|
||||
|
||||
|
||||
: random-1-float>float-quot ( -- obj ) 1-float>float random 1quotation ;
|
||||
: random-2-float>float-quot ( -- obj ) 2-float>float random 1quotation ;
|
||||
: nrandom-2-float>float-quot ( -- obj )
|
||||
[
|
||||
5
|
||||
[
|
||||
{
|
||||
[ 2-float>float random , random-float , ]
|
||||
[ 1-float>float random , ]
|
||||
} do-one
|
||||
] times
|
||||
2-float>float random ,
|
||||
] [ ] make ;
|
||||
|
||||
: test-1-float>float ( -- )
|
||||
random-float random-1-float>float-quot 1-interpreted-vs-compiled-check ;
|
||||
: test-2-float>float ( -- )
|
||||
random-float random-float random-2-float>float-quot
|
||||
2-interpreted-vs-compiled-check ;
|
||||
|
||||
: test-n-2-float>float ( -- )
|
||||
random-float random-float nrandom-2-float>float-quot
|
||||
2-interpreted-vs-compiled-check ;
|
||||
|
||||
: test-1-integer>x-runtime ( -- )
|
||||
random-integer random-1-integer>x-quot 1-runtime-check ;
|
||||
|
||||
: random-1-integer>x-throws-quot ( -- obj ) 1-integer>x-throws random 1quotation ;
|
||||
: random-1-ratio>x-throws-quot ( -- obj ) 1-ratio>x-throws random 1quotation ;
|
||||
: test-1-integer>x-throws ( -- obj )
|
||||
random-integer random-1-integer>x-throws-quot
|
||||
1-interpreted-vs-compiled-check-catch ;
|
||||
: test-1-ratio>x-throws ( -- obj )
|
||||
random-ratio random-1-ratio>x-throws-quot
|
||||
1-interpreted-vs-compiled-check-catch ;
|
||||
|
||||
|
||||
|
||||
: test-2-integer>x-throws ( -- )
|
||||
[
|
||||
random-integer , random-integer ,
|
||||
2-x>y-throws random ,
|
||||
] [ ] make 2-interpreted-vs-compiled-check-catch ;
|
||||
|
||||
! : test-^-ratio ( -- )
|
||||
! [
|
||||
! random-ratio , random-ratio , \ ^ ,
|
||||
! ] [ ] make interp-compile-check-catch ;
|
||||
|
||||
: test-0-float?-when
|
||||
[
|
||||
random-number , \ dup , \ float? , 1-float>x random 1quotation , \ when ,
|
||||
] [ ] make 0-runtime-check ;
|
||||
|
||||
: test-1-integer?-when
|
||||
random-integer [
|
||||
\ dup , \ integer? , 1-integer>x random 1quotation , \ when ,
|
||||
] [ ] make 1-interpreted-vs-compiled-check ;
|
||||
|
||||
: test-1-ratio?-when
|
||||
random-ratio [
|
||||
\ dup , \ ratio? , 1-ratio>x random 1quotation , \ when ,
|
||||
] [ ] make 1-interpreted-vs-compiled-check ;
|
||||
|
||||
: test-1-float?-when
|
||||
random-float [
|
||||
\ dup , \ float? , 1-float>x random 1quotation , \ when ,
|
||||
] [ ] make 1-interpreted-vs-compiled-check ;
|
||||
|
||||
: test-1-complex?-when
|
||||
random-complex [
|
||||
\ dup , \ complex? , 1-complex>x random 1quotation , \ when ,
|
||||
] [ ] make 1-interpreted-vs-compiled-check ;
|
||||
|
||||
|
||||
: many-word-test ( -- )
|
||||
#! defines words a1000 down to a0, which does a trivial addition
|
||||
"random-tester-scratchpad" vocabularies get delete-at
|
||||
"random-tester-scratchpad" set-in
|
||||
"a0" "random-tester-scratchpad" create [ 1 1 + ] define-compound
|
||||
100 [
|
||||
[ 1+ "a" swap unparse append "random-tester-scratchpad" create ] keep
|
||||
"a" swap unparse append [ parse ] catch [ :1 ] when define-compound
|
||||
] each ;
|
||||
|
||||
: compile-loop ( -- )
|
||||
10 [ many-word-test "a100" parse first compile ] times ;
|
||||
|
||||
: random-test
|
||||
"----" print
|
||||
{
|
||||
test-1-integer>x
|
||||
test-1-ratio>x
|
||||
test-1-float>x
|
||||
test-1-complex>x
|
||||
test-1-integer>x-throws
|
||||
test-1-ratio>x-throws
|
||||
test-1-float>float
|
||||
test-2-float>float
|
||||
! test-n-2-float>float
|
||||
test-1-integer>x-runtime
|
||||
! test-0-float?-when
|
||||
test-1-integer?-when
|
||||
test-1-ratio?-when
|
||||
test-1-float?-when
|
||||
test-1-complex?-when
|
||||
! full-gc
|
||||
! code-gc
|
||||
} random dup . execute nl ;
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
USING: compiler errors inference interpreter io kernel math
|
||||
memory namespaces prettyprint random-tester sequences tools
|
||||
quotations words arrays definitions generic graphs
|
||||
hashtables byte-arrays assocs network ;
|
||||
IN: random-tester2
|
||||
|
||||
: dangerous-words ( -- array )
|
||||
{
|
||||
die
|
||||
set-walker-hook exit
|
||||
>r r> ndrop
|
||||
|
||||
set-callstack set-word set-word-prop
|
||||
set-catchstack set-namestack set-retainstack
|
||||
set-continuation-retain continuation-catch
|
||||
set-continuation-name catchstack retainstack
|
||||
set-no-math-method-generic
|
||||
set-no-math-method-right
|
||||
set-check-method-class
|
||||
set-check-create-name
|
||||
set-pathname-string
|
||||
set-check-create-vocab
|
||||
set-check-method-generic
|
||||
<check-create> check-create?
|
||||
reset-generic forget-class
|
||||
create forget-word forget-vocab forget
|
||||
forget-methods forget-predicate
|
||||
remove-word-prop empty-method
|
||||
continue-with <continuation>
|
||||
|
||||
define-compound define make-generic
|
||||
define-method define-predicate-class
|
||||
define-tuple-class define-temp define-tuple-slots
|
||||
define-writer define-predicate define-generic
|
||||
(define-union-class)
|
||||
define-declared define-class
|
||||
define-union-class define-inline
|
||||
?make-generic define-reader define-slot define-slots
|
||||
define-typecheck define-slot-word define-union-class
|
||||
define-simple-generic with-methods define-constructor
|
||||
predicate-word condition-continuation define-symbol
|
||||
tuple-predicate (sort-classes)
|
||||
|
||||
stdio
|
||||
close readln read1 read read-until
|
||||
stream-read stream-readln stream-read1 lines
|
||||
contents stream-copy stream-flush
|
||||
lines-loop
|
||||
stream-format set-line-reader-cr
|
||||
<client-stream> <server> <client>
|
||||
<duplex-stream> <file-writer> <file-reader>
|
||||
<style-stream> style-stream default-constructor
|
||||
init-namespaces plain-writer
|
||||
|
||||
with-datastack <quotation> datastack-underflow.
|
||||
(delegates) simple-slot , # %
|
||||
<continuation> continue-with set-delegate
|
||||
callcc0 callcc1
|
||||
|
||||
:r :s :c
|
||||
|
||||
(next-power-of-2) (^) d>w/w w>h/h millis
|
||||
(random) ^n integer, first-bignum
|
||||
most-positive-fixnum ^ init-random next-power-of-2
|
||||
most-negative-fixnum
|
||||
|
||||
clear-assoc build-graph
|
||||
|
||||
set-word-def set-word-name
|
||||
set-word-props
|
||||
set set-axis set-delegate set-global set-restart-obj
|
||||
|
||||
|
||||
|
||||
gensym random
|
||||
|
||||
double>bits float>bits >bignum
|
||||
|
||||
class-predicates delete (delete) memq?
|
||||
prune join concat group at+
|
||||
normalize norm vneg vmax vmin v- v+ [v-]
|
||||
times repeat (repeat)
|
||||
supremum infimum at norm-sq
|
||||
product sum curry remove-all member? subseq?
|
||||
|
||||
! O(n) on bignums
|
||||
(add-vertex) (prune) (split) digits>integer
|
||||
substitute ?head ?tail add-vertex all? base> closure
|
||||
drop-prefix
|
||||
find-last-sep format-column head? index index*
|
||||
last-index mismatch push-new remove-vertex reset-props
|
||||
seq-quot-uses sequence= split split, split1 start
|
||||
start* string-lines string>integer tail? v.
|
||||
|
||||
stack-picture
|
||||
|
||||
! allot crashes
|
||||
at+ natural-sort
|
||||
|
||||
# % (delegates) +@ , . .s <continuation>
|
||||
<quotation> <word> be> bin> callstack changed-word
|
||||
changed-words continue-with counter dec
|
||||
global
|
||||
hex> inc le> namespace namestack nest oct> off
|
||||
on parent-dir path+
|
||||
simple-slot simple-slots string>number tabular-output
|
||||
unxref-word xref-word xref-words vocabularies
|
||||
with-datastack
|
||||
|
||||
bind if-graph ! 0 >n ! GCs
|
||||
|
||||
move-backward move-forward open-slice (open-slice) ! infinite loop
|
||||
(assoc-stack) ! infinite loop
|
||||
|
||||
case ! 100000000000 t case ! takes a long time
|
||||
} ;
|
||||
|
||||
: safe-words ( -- array )
|
||||
dangerous-words {
|
||||
"arrays" "assocs" "bit-arrays" "byte-arrays"
|
||||
"errors" "generic" "graphs" "hashtables" "io"
|
||||
"kernel" "math" "namespaces" "quotations" "sbufs"
|
||||
"queues" "strings" "sequences" "vectors" "words"
|
||||
} [ words ] map concat seq-diff natural-sort ;
|
||||
|
||||
safe-words \ safe-words set-global
|
||||
|
||||
: databank ( -- array )
|
||||
{
|
||||
! V{ } H{ } V{ 3 } { 3 } { } "" "asdf"
|
||||
pi 1/0. -1/0. 0/0. [ ]
|
||||
f t "" 0 0.0 3.14 2 -3 -7 20 3/4 -3/4 1.2/3 3.5
|
||||
C{ 2 2 } C{ 1/0. 1/0. }
|
||||
} ;
|
||||
|
||||
: setup-test ( #data #code -- data... quot )
|
||||
#! variable stack effect
|
||||
>r [ databank random ] times r>
|
||||
[ drop \ safe-words get random ] map >quotation ;
|
||||
|
||||
SYMBOL: before
|
||||
SYMBOL: after
|
||||
SYMBOL: quot
|
||||
SYMBOL: err
|
||||
err off
|
||||
|
||||
: test-compiler ( data... quot -- ... )
|
||||
err off
|
||||
dup quot set
|
||||
datastack clone dup pop* before set
|
||||
[ call ] catch drop datastack clone after set
|
||||
clear
|
||||
before get [ ] each
|
||||
quot get [ compile-1 ] [ err on ] recover ;
|
||||
|
||||
: do-test ( data... quot -- )
|
||||
.s flush test-compiler
|
||||
err get [
|
||||
datastack after get 2dup = [
|
||||
2drop
|
||||
] [
|
||||
[ . ] each
|
||||
"--" print [ . ] each quot get .
|
||||
"not =" throw
|
||||
] if
|
||||
] unless
|
||||
clear ;
|
||||
|
||||
: random-test* ( #data #code -- )
|
||||
setup-test do-test ;
|
||||
|
||||
: run-random-tester2
|
||||
100000000000000 [ 6 3 random-test* ] times ;
|
||||
|
||||
|
||||
! A worthwhile test that has not been run extensively
|
||||
|
||||
1000 [ drop gensym ] map "syms" set-global
|
||||
|
||||
: fooify-test
|
||||
"syms" get-global random
|
||||
2000 random >quotation
|
||||
over set-word-def
|
||||
100 random zero? [ code-gc ] when
|
||||
compile fooify-test ;
|
||||
|
|
@ -1,218 +0,0 @@
|
|||
USING: arrays errors generic hashtables io kernel lazy-lists math
|
||||
memory modules namespaces null-stream prettyprint random-tester2
|
||||
quotations sequences strings
|
||||
tools vectors words ;
|
||||
IN: random-tester
|
||||
|
||||
: inert ;
|
||||
TUPLE: inert-object ;
|
||||
|
||||
: inputs ( -- seq )
|
||||
{
|
||||
0 -1 -1000000000000000000000000 2
|
||||
inert
|
||||
-29/2
|
||||
1000000000000000000000000000000/1111111111111111111111111111111111
|
||||
3/4
|
||||
-1000000000000000000000000/111111111111111111
|
||||
-3.14 1/0. 0.0 -1/0. 3.14 0/0.
|
||||
20102101010100110110
|
||||
C{ 1 -1 }
|
||||
W{ 55 }
|
||||
{ }
|
||||
f t
|
||||
""
|
||||
"asdf"
|
||||
[ ]
|
||||
! DLL" libm.dylib"
|
||||
! ALIEN: 1
|
||||
T{ inert-object f }
|
||||
}
|
||||
[
|
||||
H{ { 1 2 } { "asdf" "foo" } } clone ,
|
||||
H{ } clone ,
|
||||
V{ 1 0 65536 } clone ,
|
||||
V{ } clone ,
|
||||
SBUF" " clone ,
|
||||
B{ } clone ,
|
||||
?{ } clone ,
|
||||
] { } make append ;
|
||||
|
||||
TUPLE: success quot inputs outputs input-types output-types ;
|
||||
|
||||
SYMBOL: err
|
||||
SYMBOL: last-time
|
||||
SYMBOL: quot
|
||||
SYMBOL: output
|
||||
SYMBOL: input
|
||||
SYMBOL: silent
|
||||
t silent set-global
|
||||
|
||||
: test-quot ( input quot -- success/f )
|
||||
! 2dup swap . . flush
|
||||
! dup [ hash+ ] = [ 2dup . . flush ] when
|
||||
err off
|
||||
quot set input set
|
||||
silent get [
|
||||
quot get last-time get = [
|
||||
quot get
|
||||
dup . flush
|
||||
last-time set
|
||||
] unless
|
||||
] unless
|
||||
[
|
||||
clear
|
||||
input get >vector set-datastack quot get
|
||||
[ [ [ call ] { } make drop ] with-null-stream ]
|
||||
[ err on ] recover
|
||||
datastack clone output set
|
||||
] with-saved-datastack
|
||||
err get [
|
||||
f
|
||||
] [
|
||||
quot get input get output get
|
||||
2dup [ [ type ] map ] 2apply <success>
|
||||
] if ;
|
||||
|
||||
: test-inputs ( word -- seq )
|
||||
[
|
||||
[ word-input-count inputs swap ] keep
|
||||
1quotation [
|
||||
test-quot [ , ] when*
|
||||
] curry each-permutation
|
||||
] { } make ;
|
||||
|
||||
: >types ( quot -- seq )
|
||||
map concat prune natural-sort ;
|
||||
|
||||
: >output-types ( seq -- seq )
|
||||
#! input seq is the result of test-inputs
|
||||
[ success-output-types ] >types ;
|
||||
|
||||
: >input-types ( seq -- seq )
|
||||
#! input seq is the result of test-inputs
|
||||
[ success-input-types ] >types ;
|
||||
|
||||
TUPLE: typed quot inputs outputs ;
|
||||
|
||||
: successes>typed ( seq -- typed )
|
||||
dup empty? [
|
||||
drop f { } clone { } clone <typed>
|
||||
] [
|
||||
[ first success-quot ] keep
|
||||
[ >input-types ] keep >output-types <typed>
|
||||
] if ;
|
||||
|
||||
: word>type-check ( word -- tuple )
|
||||
[
|
||||
dup test-inputs
|
||||
successes>typed ,
|
||||
] curry [ with-saved-datastack ] { } make first ;
|
||||
|
||||
: type>name ( n -- string )
|
||||
dup integer? [
|
||||
{
|
||||
"fixnum"
|
||||
"bignum"
|
||||
"word"
|
||||
"obj"
|
||||
"ratio"
|
||||
"float"
|
||||
"complex"
|
||||
"wrapper"
|
||||
"array"
|
||||
"boolean"
|
||||
"hashtable"
|
||||
"vector"
|
||||
"string"
|
||||
"sbuf"
|
||||
"quotation"
|
||||
"dll"
|
||||
"alien"
|
||||
"tuple"
|
||||
} nth
|
||||
] when ;
|
||||
|
||||
: replace-subseqs ( seq new old -- seq )
|
||||
[
|
||||
swapd split1 [ append swap add ] [ nip ] if*
|
||||
] 2each ;
|
||||
|
||||
: type-array>name ( seq -- seq )
|
||||
{
|
||||
{ "object" { 0 1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } }
|
||||
{ "seq3" { 0 1 8 9 11 12 13 14 } }
|
||||
{ "seq2" { 0 8 9 11 12 13 14 } }
|
||||
{ "seq" { 8 9 11 12 13 14 } }
|
||||
{ "number" { 0 1 4 5 6 } }
|
||||
{ "real" { 0 1 4 5 } }
|
||||
{ "rational" { 0 1 4 } }
|
||||
{ "integer" { 0 1 } }
|
||||
{ "float/complex" { 5 6 } }
|
||||
{ "word/f" { 2 9 } }
|
||||
} flip first2 replace-subseqs [ type>name ] map ;
|
||||
|
||||
: buggy?
|
||||
[ word>type-check ] catch [
|
||||
drop f
|
||||
] [
|
||||
2array [ [ type-array>name ] map ] map
|
||||
[ [ length 1 = ] all? ] all? not
|
||||
] if ;
|
||||
|
||||
: variable-stack-effect?
|
||||
[ word>type-check ] catch nip ;
|
||||
|
||||
: find-words ( quot -- seq )
|
||||
\ safe-words get
|
||||
[
|
||||
word-input-count 3 <=
|
||||
] subset swap subset ;
|
||||
|
||||
: find-safe ( -- seq ) [ buggy? not ] find-words ;
|
||||
|
||||
: find-buggy ( -- seq ) [ buggy? ] find-words ;
|
||||
|
||||
: test-word ( output input word -- ? )
|
||||
1quotation test-quot dup [
|
||||
success-outputs sequence=
|
||||
] [
|
||||
nip
|
||||
] if ;
|
||||
|
||||
: word-finder ( inputs outputs -- seq )
|
||||
swap safe-words
|
||||
[ >r 2dup r> test-word ] subset 2nip ;
|
||||
|
||||
: (enumeration-test)
|
||||
[
|
||||
[ stack-effect effect-in length ] catch [ 4 < ] unless
|
||||
] subset [ [ test-inputs successes>typed , ] each ] { } make ;
|
||||
|
||||
! full-gc finds corrupted memory faster
|
||||
|
||||
: enumeration-test ( -- seq )
|
||||
[
|
||||
\ safe-words get
|
||||
f silent set
|
||||
(enumeration-test)
|
||||
] with-scope ;
|
||||
|
||||
: array>all-quots ( seq n -- seq )
|
||||
[
|
||||
[ 1+ [ >quotation , ] each-permutation ] each-with
|
||||
] { } make ;
|
||||
|
||||
: array>all ( seq n -- seq )
|
||||
dupd array>all-quots append ;
|
||||
|
||||
: quot-finder ( inputs outputs -- seq )
|
||||
swap safe-words 2 array>all
|
||||
[
|
||||
3 [ >quotation >r 2dup r> [ test-quot ] keep
|
||||
swap [ , ] [ drop ] if ] each-permutation
|
||||
] { } make ;
|
||||
|
||||
: word-frequency ( -- alist )
|
||||
all-words [ dup usage length 2array ] map sort-values ;
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
USING: generic kernel math sequences namespaces errors
|
||||
assocs words arrays parser compiler syntax io
|
||||
quotations optimizer inference shuffle tools prettyprint ;
|
||||
IN: random-tester
|
||||
|
||||
: word-input-count ( word -- n )
|
||||
[ stack-effect effect-in length ] [ 2drop 0 ] recover ;
|
||||
|
||||
: type-error? ( exception -- ? )
|
||||
[ swap execute or ] curry
|
||||
>r { no-method? no-math-method? } f r> reduce ;
|
||||
|
||||
! HASHTABLES
|
||||
: random-hash-entry ( hash -- key value )
|
||||
[ keys random dup ] keep at ;
|
||||
|
||||
: coin-flip ( -- bool ) 2 random zero? ;
|
||||
: do-one ( seq -- ) random call ; inline
|
||||
|
||||
: nzero-array ( seq -- )
|
||||
dup length >r 0 r> [ pick set-nth ] each-with drop ;
|
||||
|
||||
: zero-array ( n -- seq ) [ drop 0 ] map ;
|
||||
|
||||
TUPLE: p-list seq max count count-vec ;
|
||||
: make-p-list ( seq n -- tuple )
|
||||
>r dup length [ 1- ] keep r>
|
||||
[ ^ 0 swap 2array ] keep
|
||||
zero-array <p-list> ;
|
||||
|
||||
: inc-seq ( seq max -- )
|
||||
2dup [ < ] curry find-last over -1 = [
|
||||
3drop nzero-array
|
||||
] [
|
||||
nipd 1+ 2over swap set-nth
|
||||
1+ over length rot <slice> nzero-array
|
||||
] if ;
|
||||
|
||||
: inc-count ( tuple -- )
|
||||
[ p-list-count first2 >r 1+ r> 2array ] keep
|
||||
set-p-list-count ;
|
||||
|
||||
: get-permutation ( tuple -- seq )
|
||||
[ p-list-seq ] keep p-list-count-vec [ swap nth ] map-with ;
|
||||
|
||||
: p-list-next ( tuple -- seq/f )
|
||||
dup p-list-count first2 < [
|
||||
[
|
||||
[ get-permutation ] keep
|
||||
[ p-list-count-vec ] keep p-list-max
|
||||
inc-seq
|
||||
] keep inc-count
|
||||
] [
|
||||
drop f
|
||||
] if ;
|
||||
|
||||
: (permutations) ( tuple -- )
|
||||
dup p-list-next [ , (permutations) ] [ drop ] if* ;
|
||||
|
||||
: permutations ( seq n -- seq )
|
||||
make-p-list [ (permutations) ] { } make ;
|
||||
|
||||
: (each-permutation) ( tuple quot -- )
|
||||
over p-list-next [
|
||||
[ rot drop swap call ] 3keep
|
||||
drop (each-permutation)
|
||||
] [
|
||||
2drop
|
||||
] if* ; inline
|
||||
|
||||
: each-permutation ( seq n quot -- )
|
||||
>r make-p-list r> (each-permutation) ;
|
||||
|
||||
SYMBOL: saved-datastack
|
||||
: with-saved-datastack
|
||||
>r datastack saved-datastack set r> call
|
||||
saved-datastack get set-datastack ; inline
|
Loading…
Reference in New Issue