bring back ( x: type y: type -- ) stack effect syntax, and automatically hint words based on types in their declared effect
parent
522f426ba7
commit
19b10fb85e
|
@ -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,14 @@ M: class specializer-declaration ;
|
||||||
|
|
||||||
M: object specializer-declaration class ;
|
M: object specializer-declaration class ;
|
||||||
|
|
||||||
|
: specialized? ( types -- ? )
|
||||||
|
[ object = ] all? not ;
|
||||||
|
|
||||||
|
: specializer ( word -- specializer )
|
||||||
|
[ "specializer" word-prop ]
|
||||||
|
[ stack-effect effect-in-types ] bi
|
||||||
|
dup specialized? [ suffix ] [ drop ] if ;
|
||||||
|
|
||||||
: make-specializer ( specs -- quot )
|
: make-specializer ( specs -- quot )
|
||||||
dup length <reversed>
|
dup length <reversed>
|
||||||
[ (picker) 2array ] 2map
|
[ (picker) 2array ] 2map
|
||||||
|
@ -49,7 +57,7 @@ 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
|
[ "method-generic" word-prop specializer ] bi
|
||||||
[ specialize-quot ] when* ;
|
[ specialize-quot ] when* ;
|
||||||
|
|
||||||
: standard-method? ( method -- ? )
|
: standard-method? ( method -- ? )
|
||||||
|
@ -61,7 +69,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* ]
|
[ specializer [ specialize-quot ] when* ]
|
||||||
bi
|
bi
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
Loading…
Reference in New Issue