! Copyright (C) 2009 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: classes.tuple help.markup help.syntax kernel math quotations sequences stack-checker arrays ; IN: combinators.smart HELP: inputarray { $values { "quot" quotation } { "array" array } } { $description "Infers the number of 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" } { "seq" sequence } } { $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-outputs { $values { "quot" quotation } { "operation" 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-outputs ." "-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" } } ; HELP: append-outputs { $values { "quot" quotation } { "seq" sequence } } { $description "Infers the number of outputs from " { $snippet "quot" } " and returns a sequence of the outputs appended." } { $examples { $example "USING: combinators.smart prettyprint ;" "[ { 1 2 } { \"A\" \"b\" } ] append-outputs ." "{ 1 2 \"A\" \"b\" }" } } ; HELP: append-outputs-as { $values { "quot" quotation } { "exemplar" sequence } { "seq" sequence } } { $description "Infers the number of outputs from " { $snippet "quot" } " and returns a sequence of type " { $snippet "exemplar" } " of the outputs appended." } { $examples { $example "USING: combinators.smart prettyprint ;" "[ { 1 2 } { \"A\" \"b\" } ] V{ } append-outputs-as ." "V{ 1 2 \"A\" \"b\" }" } } ; { append-outputs append-outputs-as } related-words HELP: drop-outputs { $values { "quot" quotation } } { $description "Calls a quotation and drops any values it leaves on the stack." } ; HELP: keep-inputs { $values { "quot" quotation } } { $description "Calls a quotation and preserves any values it takes off the stack." } ; { drop-outputs keep-inputs } related-words HELP: dropping { $values { "quot" quotation } { "quot'" quotation } } { $description "Outputs a quotation that, when called, will have the effect of dropping the number of inputs to the original quotation." } { $examples { $example """USING: combinators.smart math prettyprint ; [ + + ] dropping .""" """[ 3 ndrop ]""" } } ; HELP: inputsequence output>array } "Reducing the set of output values:" { $subsections reduce-outputs map-reduce-outputs } "Applying a quotation to groups of elements on the stack:" { $subsections smart-apply } "Summing output values:" { $subsections sum-outputs } "Concatenating output values:" { $subsections append-outputs append-outputs-as } "Drop the outputs after calling a quotation:" { $subsections drop-outputs } "Cause a quotation to act as a no-op and drop the inputs:" { $subsection nullary } "Preserve the inputs below or above the outputs of the quotation:" { $subsections preserving keep-inputs } "Versions of if that infer how many inputs to keep from the predicate quotation:" { $subsections smart-if smart-when smart-unless } "Versions of if* that infer how many inputs to keep from the predicate quotation:" { $subsections smart-if* smart-when* smart-unless* } "New smart combinators can be created by defining " { $link "macros" } " which call " { $link infer } "." ; ABOUT: "combinators.smart"