Merge branch 'master' of git://factorcode.org/git/factor

db4
Slava Pestov 2009-09-08 16:23:37 -05:00
commit fe25bb097f
9 changed files with 124 additions and 16 deletions

View File

@ -0,0 +1 @@
Joe Groff

View File

@ -0,0 +1 @@
Tuple-like access to structured raw memory

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008, 2009 Slava Pestov. ! Copyright (C) 2008, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs byte-arrays byte-vectors classes USING: accessors arrays assocs byte-arrays byte-vectors classes
combinators definitions fry generic generic.single combinators definitions effects fry generic generic.single
generic.standard hashtables io.binary io.streams.string kernel generic.standard hashtables io.binary io.streams.string kernel
kernel.private math math.parser namespaces parser sbufs kernel.private math math.parser namespaces parser sbufs
sequences splitting splitting.private strings vectors words ; sequences splitting splitting.private strings vectors words ;
@ -19,6 +19,9 @@ M: class specializer-declaration ;
M: object specializer-declaration class ; M: object specializer-declaration class ;
: specializer ( word -- specializer )
"specializer" word-prop ;
: make-specializer ( specs -- quot ) : make-specializer ( specs -- quot )
dup length <reversed> dup length <reversed>
[ (picker) 2array ] 2map [ (picker) 2array ] 2map
@ -28,14 +31,14 @@ M: object specializer-declaration class ;
[ ] [ swap [ f ] \ if 3array append [ ] like ] map-reduce [ ] [ swap [ f ] \ if 3array append [ ] like ] map-reduce
] if-empty ; ] if-empty ;
: specializer-cases ( quot word -- default alist ) : specializer-cases ( quot specializer -- alist )
dup [ array? ] all? [ 1array ] unless [ dup [ array? ] all? [ 1array ] unless [
[ make-specializer ] keep [ nip make-specializer ]
[ specializer-declaration ] map '[ _ declare ] pick append [ [ specializer-declaration ] map swap '[ _ declare @ ] ] 2bi
] { } map>assoc ; ] with { } map>assoc ;
: specialize-quot ( quot specializer -- quot' ) : specialize-quot ( quot word specializer -- quot' )
specializer-cases alist>quot ; [ drop nip def>> ] [ nip specializer-cases ] 3bi alist>quot ;
! compiler.tree.propagation.inlining sets this to f ! compiler.tree.propagation.inlining sets this to f
SYMBOL: specialize-method? SYMBOL: specialize-method?
@ -49,8 +52,8 @@ t specialize-method? set-global
: specialize-method ( quot method -- quot' ) : specialize-method ( quot method -- quot' )
[ specialize-method? get [ method-declaration prepend ] [ drop ] if ] [ specialize-method? get [ method-declaration prepend ] [ drop ] if ]
[ "method-generic" word-prop "specializer" word-prop ] bi [ dup "method-generic" word-prop specializer ] bi
[ specialize-quot ] when* ; [ specialize-quot ] [ drop ] if* ;
: standard-method? ( method -- ? ) : standard-method? ( method -- ? )
dup method-body? [ dup method-body? [
@ -61,7 +64,7 @@ t specialize-method? set-global
[ def>> ] keep [ def>> ] keep
dup generic? [ drop ] [ dup generic? [ drop ] [
[ dup standard-method? [ specialize-method ] [ drop ] if ] [ dup standard-method? [ specialize-method ] [ drop ] if ]
[ "specializer" word-prop [ specialize-quot ] when* ] [ dup specializer [ specialize-quot ] [ drop ] if* ]
bi bi
] if ; ] if ;

View File

@ -1,4 +1,5 @@
USING: effects tools.test prettyprint accessors sequences ; USING: effects kernel tools.test prettyprint accessors
quotations sequences ;
IN: effects.tests IN: effects.tests
[ t ] [ 1 1 <effect> 2 2 <effect> effect<= ] unit-test [ t ] [ 1 1 <effect> 2 2 <effect> effect<= ] unit-test
@ -23,3 +24,6 @@ IN: effects.tests
[ t ] [ (( -- )) (( -- )) compose-effects (( -- )) effect= ] unit-test [ t ] [ (( -- )) (( -- )) compose-effects (( -- )) effect= ] unit-test
[ t ] [ (( -- * )) (( -- )) compose-effects (( -- * )) effect= ] unit-test [ t ] [ (( -- * )) (( -- )) compose-effects (( -- * )) effect= ] unit-test
[ t ] [ (( -- )) (( -- * )) compose-effects (( -- * )) effect= ] unit-test [ t ] [ (( -- )) (( -- * )) compose-effects (( -- * )) effect= ] unit-test
[ { object object } ] [ (( a b -- )) effect-in-types ] unit-test
[ { object sequence } ] [ (( a b: sequence -- )) effect-in-types ] unit-test

View File

@ -1,7 +1,7 @@
! Copyright (C) 2006, 2009 Slava Pestov. ! Copyright (C) 2006, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel math math.parser math.order namespaces make sequences strings USING: kernel math math.parser math.order namespaces make sequences strings
words assocs combinators accessors arrays ; words assocs combinators accessors arrays quotations ;
IN: effects IN: effects
TUPLE: effect { in read-only } { out read-only } { terminated? read-only } ; TUPLE: effect { in read-only } { out read-only } { terminated? read-only } ;
@ -53,6 +53,13 @@ M: effect effect>string ( effect -- string )
")" % ")" %
] "" make ; ] "" make ;
GENERIC: effect>type ( obj -- type )
M: object effect>type drop object ;
M: word effect>type ;
! attempting to specialize on callable breaks compiling
! M: effect effect>type drop callable ;
M: pair effect>type second effect>type ;
GENERIC: stack-effect ( word -- effect/f ) GENERIC: stack-effect ( word -- effect/f )
M: word stack-effect "declared-effect" word-prop ; M: word stack-effect "declared-effect" word-prop ;
@ -87,3 +94,8 @@ M: effect clone
[ [ [ "obj" ] replicate ] bi@ ] dip [ [ [ "obj" ] replicate ] bi@ ] dip
effect boa effect boa
] if ; inline ] if ; inline
: effect-in-types ( effect -- input-types )
in>> [ effect>type ] map ;
: effect-out-types ( effect -- input-types )
out>> [ effect>type ] map ;

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008, 2009 Slava Pestov. ! Copyright (C) 2008, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: lexer sets sequences kernel splitting effects USING: lexer sets sequences kernel splitting effects
combinators arrays ; combinators arrays vocabs.parser classes ;
IN: effects.parser IN: effects.parser
DEFER: parse-effect DEFER: parse-effect
@ -13,10 +13,11 @@ ERROR: bad-effect ;
dup { f "(" "((" } member? [ bad-effect ] [ dup { f "(" "((" } member? [ bad-effect ] [
":" ?tail [ ":" ?tail [
scan { scan {
{ "(" [ ")" parse-effect ] } { [ dup "(" = ] [ drop ")" parse-effect ] }
{ f [ ")" unexpected-eof ] } { [ dup search class? ] [ search ] }
{ [ dup f = ] [ ")" unexpected-eof ] }
[ bad-effect ] [ bad-effect ]
} case 2array } cond 2array
] when ] when
] if ] if
] if ; ] if ;

1
extra/typed/authors.txt Normal file
View File

@ -0,0 +1 @@
Joe Groff

1
extra/typed/summary.txt Normal file
View File

@ -0,0 +1 @@
Strongly-typed word definitions

84
extra/typed/typed.factor Normal file
View File

@ -0,0 +1,84 @@
! (c)Joe Groff bsd license
USING: accessors combinators combinators.short-circuit
definitions effects fry hints kernel kernel.private namespaces
parser quotations see.private sequences words ;
IN: typed
ERROR: type-mismatch-error word expected-types ;
ERROR: input-mismatch-error < type-mismatch-error ;
ERROR: output-mismatch-error < type-mismatch-error ;
! typed inputs
: typed-stack-effect? ( effect -- ? )
[ object = ] all? not ;
: input-mismatch-quot ( word types -- quot )
[ input-mismatch-error ] 2curry ;
: make-coercer ( types -- quot )
[ "coercer" word-prop [ ] or ]
[ swap \ dip [ ] 2sequence prepend ]
map-reduce ;
: typed-inputs ( quot word types -- quot' )
{
[ 2nip make-coercer ]
[ 2nip make-specializer ]
[ nip swap '[ _ declare @ ] ]
[ [ drop ] 2dip input-mismatch-quot ]
} 3cleave '[ @ @ _ _ if ] ;
! typed outputs
: output-mismatch-quot ( word types -- quot )
[ output-mismatch-error ] 2curry ;
: typed-outputs ( quot word types -- quot' )
{
[ 2drop ]
[ 2nip make-coercer ]
[ 2nip make-specializer ]
[ [ drop ] 2dip output-mismatch-quot ]
} 3cleave '[ @ @ @ _ unless ] ;
! defining typed words
: typed-gensym-quot ( def word effect -- quot )
[ nip effect-in-types swap '[ _ declare @ ] ]
[ effect-out-types dup typed-stack-effect? [ typed-outputs ] [ 2drop ] if ] 2bi ;
: define-typed-gensym ( word def effect -- gensym )
[ 3drop gensym dup ]
[ [ swap ] dip typed-gensym-quot ]
[ 2nip ] 3tri define-declared ;
PREDICATE: typed < word "typed-word" word-prop ;
: typed-quot ( quot word effect -- quot' )
[ effect-in-types dup typed-stack-effect? [ typed-inputs ] [ 2drop ] if ]
[ nip effect-out-types dup typed-stack-effect? [ '[ @ _ declare ] ] [ drop ] if ] 2bi ;
: (typed-def) ( word def effect -- quot )
[ define-typed-gensym ] 3keep
[ drop [ swap "typed-word" set-word-prop ] [ [ 1quotation ] dip ] 2bi ] dip
typed-quot ;
: typed-def ( word def effect -- quot )
dup {
[ effect-in-types typed-stack-effect? ]
[ effect-out-types typed-stack-effect? ]
} 1|| [ (typed-def) ] [ drop nip ] if ;
: define-typed ( word def effect -- )
[ [ 2drop ] [ typed-def ] [ 2nip ] 3tri define-inline ]
[ drop "typed-def" set-word-prop ]
[ 2drop "typed-word" word-prop \ word set-global ] 3tri ;
SYNTAX: TYPED:
(:) define-typed ;
M: typed definer drop \ TYPED: \ ; ;
M: typed definition "typed-def" word-prop ;
M: typed declarations. "typed-word" word-prop declarations. ;