Add combinators.smart
							parent
							
								
									a773e59216
								
							
						
					
					
						commit
						fe92608a1f
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Doug Coleman
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,91 @@
 | 
			
		|||
! Copyright (C) 2009 Doug Coleman.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: help.markup help.syntax kernel quotations math sequences
 | 
			
		||||
multiline ;
 | 
			
		||||
IN: combinators.smart
 | 
			
		||||
 | 
			
		||||
HELP: input<sequence
 | 
			
		||||
{ $values
 | 
			
		||||
     { "quot" quotation }
 | 
			
		||||
     { "newquot" quotation }
 | 
			
		||||
}
 | 
			
		||||
{ $description "Infers the number of inputs, " { $snippet "n" } ", to " { $snippet "quot" } " and calls the " { $snippet "quot" } " with the first " { $snippet "n" } " values from a sequence." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example
 | 
			
		||||
        "USING: combinators.smart math prettyprint ;"
 | 
			
		||||
        "{ 1 2 3 } [ + + ] input<sequence ."
 | 
			
		||||
        "6"
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: output>array
 | 
			
		||||
{ $values
 | 
			
		||||
     { "quot" quotation }
 | 
			
		||||
     { "newquot" quotation }
 | 
			
		||||
}
 | 
			
		||||
{ $description "Infers the number or outputs from the quotation and constructs an array from those outputs." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example
 | 
			
		||||
        <" USING: combinators combinators.smart math prettyprint ;
 | 
			
		||||
9 [
 | 
			
		||||
    { [ 1- ] [ 1+ ] [ sq ] } cleave
 | 
			
		||||
] output>array .">
 | 
			
		||||
    "{ 8 10 81 }"
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: output>sequence
 | 
			
		||||
{ $values
 | 
			
		||||
     { "quot" quotation } { "exemplar" "an exemplar" }
 | 
			
		||||
     { "newquot" quotation }
 | 
			
		||||
}
 | 
			
		||||
{ $description "Infers the number of outputs from the quotation and constructs a new sequence from those objects of the same type as the exemplar." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example
 | 
			
		||||
        "USING: combinators.smart kernel math prettyprint ;"
 | 
			
		||||
        "4 [ [ 1 + ] [ 2 + ] [ 3 + ] tri ] V{ } output>sequence ."
 | 
			
		||||
        "V{ 5 6 7 }"
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: reduce-output
 | 
			
		||||
{ $values
 | 
			
		||||
     { "quot" quotation } { "operation" quotation }
 | 
			
		||||
     { "newquot" quotation }
 | 
			
		||||
}
 | 
			
		||||
{ $description "Infers the number of outputs from " { $snippet "quot" } " and reduces them using " { $snippet "operation" } ". The identity for the " { $link reduce } " operation is the first output." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example
 | 
			
		||||
        "USING: combinators.smart kernel math prettyprint ;"
 | 
			
		||||
        "3 [ [ 4 * ] [ 4 / ] [ 4 - ] tri ] [ * ] reduce-output ."
 | 
			
		||||
        "-9"
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
HELP: sum-outputs
 | 
			
		||||
{ $values
 | 
			
		||||
     { "quot" quotation }
 | 
			
		||||
     { "n" integer }
 | 
			
		||||
}
 | 
			
		||||
{ $description "Infers the number of outputs from " { $snippet "quot" } " and returns their sum." }
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $example
 | 
			
		||||
        "USING: combinators.smart kernel math prettyprint ;"
 | 
			
		||||
        "10 [ [ 1- ] [ 1+ ] bi ] sum-outputs ."
 | 
			
		||||
        "20"
 | 
			
		||||
    }
 | 
			
		||||
} ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "combinators.smart" "Smart combinators"
 | 
			
		||||
"The " { $vocab-link "combinators.smart" } " vocabulary implements " { $emphasis "smart combinators" } ". A smart combinator is one whose behavior depends on the static stack effect of an input quotation." $nl
 | 
			
		||||
"Smart inputs from a sequence:"
 | 
			
		||||
{ $subsection input<sequence }
 | 
			
		||||
"Smart outputs to a sequence:"
 | 
			
		||||
{ $subsection output>sequence }
 | 
			
		||||
{ $subsection output>array }
 | 
			
		||||
"Reducing the output of a quotation:"
 | 
			
		||||
{ $subsection reduce-output }
 | 
			
		||||
"Summing the output of a quotation:"
 | 
			
		||||
{ $subsection sum-outputs } ;
 | 
			
		||||
 | 
			
		||||
ABOUT: "combinators.smart"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
! Copyright (C) 2009 Doug Coleman.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: tools.test combinators.smart math kernel ;
 | 
			
		||||
IN: combinators.smart.tests
 | 
			
		||||
 | 
			
		||||
: test-bi ( -- 9 11 )
 | 
			
		||||
    10 [ 1- ] [ 1+ ] bi ;
 | 
			
		||||
 | 
			
		||||
[ [ test-bi ] output>array ] must-infer
 | 
			
		||||
[ { 9 11 } ] [ [ test-bi ] output>array ] unit-test
 | 
			
		||||
 | 
			
		||||
[ { 9 11 } [ + ] input<sequence ] must-infer
 | 
			
		||||
[ 20 ] [ { 9 11 } [ + ] input<sequence ] unit-test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
[ 6 ] [ [ 1 2 3 ] [ + ] reduce-output ] unit-test
 | 
			
		||||
 | 
			
		||||
[ [ 1 2 3 ] [ + ] reduce-output ] must-infer
 | 
			
		||||
 | 
			
		||||
[ 6 ] [ [ 1 2 3 ] sum-outputs ] unit-test
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
! Copyright (C) 2009 Doug Coleman.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors fry generalizations kernel macros math.order
 | 
			
		||||
stack-checker math ;
 | 
			
		||||
IN: combinators.smart
 | 
			
		||||
 | 
			
		||||
MACRO: output>sequence ( quot exemplar -- newquot )
 | 
			
		||||
    [ dup infer out>> ] dip
 | 
			
		||||
    '[ @ _ _ nsequence ] ;
 | 
			
		||||
 | 
			
		||||
: output>array ( quot -- newquot )
 | 
			
		||||
    { } output>sequence ; inline
 | 
			
		||||
 | 
			
		||||
MACRO: input<sequence ( quot -- newquot )
 | 
			
		||||
    [ infer in>> ] keep
 | 
			
		||||
    '[ _ firstn @ ] ;
 | 
			
		||||
 | 
			
		||||
MACRO: reduce-output ( quot operation -- newquot )
 | 
			
		||||
    [ dup infer out>> 1 [-] ] dip n*quot compose ;
 | 
			
		||||
 | 
			
		||||
: sum-outputs ( quot -- n )
 | 
			
		||||
    [ + ] reduce-output ; inline
 | 
			
		||||
		Loading…
	
		Reference in New Issue