effects: fix bug reported by Joe where printing { f } { } <effect> kills the listener; simpler implementation of 'shuffle'; add compiler transform to 'shuffle' if effect is constant
parent
739330577f
commit
3bd22a39f6
|
@ -2,7 +2,7 @@
|
||||||
! Cavazos, Slava Pestov.
|
! Cavazos, Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel sequences sequences.private math combinators
|
USING: kernel sequences sequences.private math combinators
|
||||||
macros quotations fry ;
|
macros quotations fry stack-checker.transforms effects ;
|
||||||
IN: generalizations
|
IN: generalizations
|
||||||
|
|
||||||
<<
|
<<
|
||||||
|
@ -95,3 +95,11 @@ MACRO: nweave ( n -- )
|
||||||
[ narray concat ] dip like ; inline
|
[ narray concat ] dip like ; inline
|
||||||
|
|
||||||
: nappend ( n -- seq ) narray concat ; inline
|
: nappend ( n -- seq ) narray concat ; inline
|
||||||
|
|
||||||
|
: nths-quot ( indices -- quot )
|
||||||
|
[ [ '[ _ swap nth ] ] map ] [ length ] bi
|
||||||
|
'[ _ cleave _ narray ] ;
|
||||||
|
|
||||||
|
\ shuffle [
|
||||||
|
shuffle-mapping nths-quot
|
||||||
|
] 1 define-transform
|
|
@ -9,9 +9,13 @@ USING: effects tools.test prettyprint accessors sequences ;
|
||||||
[ 2 ] [ (( a b -- c )) in>> length ] unit-test
|
[ 2 ] [ (( a b -- c )) in>> length ] unit-test
|
||||||
[ 1 ] [ (( a b -- c )) out>> length ] unit-test
|
[ 1 ] [ (( a b -- c )) out>> length ] unit-test
|
||||||
|
|
||||||
|
[ "(( object -- object ))" ] [ { f } { f } <effect> unparse ] unit-test
|
||||||
[ "(( a b -- c d ))" ] [ { "a" "b" } { "c" "d" } <effect> unparse ] unit-test
|
[ "(( a b -- c d ))" ] [ { "a" "b" } { "c" "d" } <effect> unparse ] unit-test
|
||||||
[ "(( -- c d ))" ] [ { } { "c" "d" } <effect> unparse ] unit-test
|
[ "(( -- c d ))" ] [ { } { "c" "d" } <effect> unparse ] unit-test
|
||||||
[ "(( a b -- ))" ] [ { "a" "b" } { } <effect> unparse ] unit-test
|
[ "(( a b -- ))" ] [ { "a" "b" } { } <effect> unparse ] unit-test
|
||||||
[ "(( -- ))" ] [ { } { } <effect> unparse ] unit-test
|
[ "(( -- ))" ] [ { } { } <effect> unparse ] unit-test
|
||||||
[ "(( a b -- c ))" ] [ (( a b -- c )) unparse ] unit-test
|
[ "(( a b -- c ))" ] [ (( a b -- c )) unparse ] unit-test
|
||||||
|
|
||||||
|
[ { "x" "y" } ] [ { "y" "x" } (( a b -- b a )) shuffle ] unit-test
|
||||||
|
[ { "y" "x" "y" } ] [ { "y" "x" } (( a b -- a b a )) shuffle ] unit-test
|
||||||
|
[ { } ] [ { "y" "x" } (( a b -- )) shuffle ] unit-test
|
|
@ -1,4 +1,4 @@
|
||||||
! Copyright (C) 2006, 2008 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 namespaces make sequences strings
|
USING: kernel math math.parser namespaces make sequences strings
|
||||||
words assocs combinators accessors arrays ;
|
words assocs combinators accessors arrays ;
|
||||||
|
@ -24,6 +24,7 @@ TUPLE: effect in out terminated? ;
|
||||||
|
|
||||||
GENERIC: effect>string ( obj -- str )
|
GENERIC: effect>string ( obj -- str )
|
||||||
M: string effect>string ;
|
M: string effect>string ;
|
||||||
|
M: object effect>string drop "object" ;
|
||||||
M: word effect>string name>> ;
|
M: word effect>string name>> ;
|
||||||
M: integer effect>string number>string ;
|
M: integer effect>string number>string ;
|
||||||
M: pair effect>string first2 [ effect>string ] bi@ ": " glue ;
|
M: pair effect>string first2 [ effect>string ] bi@ ": " glue ;
|
||||||
|
@ -45,8 +46,8 @@ M: effect effect>string ( effect -- string )
|
||||||
GENERIC: stack-effect ( word -- effect/f )
|
GENERIC: stack-effect ( word -- effect/f )
|
||||||
|
|
||||||
M: word stack-effect
|
M: word stack-effect
|
||||||
{ "declared-effect" "inferred-effect" }
|
"inferred-effect" "declared-effect"
|
||||||
swap props>> [ at ] curry map [ ] find nip ;
|
[ word-prop ] bi-curry@ bi or ;
|
||||||
|
|
||||||
M: effect clone
|
M: effect clone
|
||||||
[ in>> clone ] [ out>> clone ] bi <effect> ;
|
[ in>> clone ] [ out>> clone ] bi <effect> ;
|
||||||
|
@ -57,11 +58,8 @@ M: effect clone
|
||||||
: split-shuffle ( stack shuffle -- stack1 stack2 )
|
: split-shuffle ( stack shuffle -- stack1 stack2 )
|
||||||
in>> length cut* ;
|
in>> length cut* ;
|
||||||
|
|
||||||
: load-shuffle ( stack shuffle -- )
|
: shuffle-mapping ( effect -- mapping )
|
||||||
in>> [ set ] 2each ;
|
[ out>> ] [ in>> ] bi [ index ] curry map ;
|
||||||
|
|
||||||
: shuffled-values ( shuffle -- values )
|
|
||||||
out>> [ get ] map ;
|
|
||||||
|
|
||||||
: shuffle ( stack shuffle -- newstack )
|
: shuffle ( stack shuffle -- newstack )
|
||||||
[ [ load-shuffle ] keep shuffled-values ] with-scope ;
|
shuffle-mapping swap nths ;
|
||||||
|
|
Loading…
Reference in New Issue