1 USING: arrays help.markup help.syntax strings sbufs
2 vectors kernel combinators ;
5 ARTICLE: "quotations" "Quotations"
6 "Conceptually, a quotation is an anonymous function (a value denoting a snippet of code) which can be passed around and called."
8 "Concretely, a quotation is an immutable sequence of objects, some of which may be words, together with a block of machine code which may be executed to achieve the effect of evaluating the quotation. The machine code is generated by a fast non-optimizing quotation compiler which is always running and is transparent to the developer."
10 "Quotations evaluate sequentially from beginning to end. Literals are pushed on the stack and words are executed. Details can be found in " { $link "evaluator" } "."
12 "Quotation literal syntax is documented in " { $link "syntax-quots" } "."
14 "Quotations implement the " { $link "sequence-protocol" } ", and existing sequences can be converted into quotations:"
15 { $subsection >quotation }
16 { $subsection 1quotation }
18 { $subsection "wrappers" } ;
20 ARTICLE: "wrappers" "Wrappers"
21 "Wrappers are used to push words on the data stack; they evaluate to the object being wrapped:"
22 { $subsection wrapper }
23 { $subsection literalize }
24 { $see-also "dataflow" "combinators" } ;
29 { $class-description "The class whose instances can be passed to " { $link call } ". This includes quotations and composed quotations built up with " { $link curry } " or " { $link compose } "." } ;
32 { $description "The class of quotations. See " { $link "syntax-quots" } " for syntax and " { $link "quotations" } " for general information." } ;
35 { $values { "seq" "a sequence" } { "quot" quotation } }
36 { $description "Outputs a freshly-allocated quotation with the same elements as a given sequence." } ;
39 { $values { "obj" object } { "quot" quotation } }
40 { $description "Constructs a quotation holding one element." }
42 "The following two phrases are equivalent:"
43 { $code "\\ reverse execute" }
44 { $code "\\ reverse 1quotation call" }
48 { $description "The class of wrappers. Wrappers are created by calling " { $link literalize } ". See " { $link "syntax-words" } " for syntax." } ;
50 HELP: <wrapper> ( obj -- wrapper )
51 { $values { "obj" object } { "wrapper" wrapper } }
52 { $description "Creates an object which pushes " { $snippet "obj" } " on the stack when evaluated. User code should call " { $link literalize } " instead, since it avoids wrapping self-evaluating objects (which is redundant)." } ;
55 { $values { "obj" object } { "wrapped" object } }
56 { $description "Outputs an object which evaluates to " { $snippet "obj" } " when placed in a quotation. If " { $snippet "obj" } " is not self-evaluating (for example, it is a word), then it will be wrapped." }
58 { $example "USING: prettyprint quotations ;" "5 literalize ." "5" }
59 { $example "USING: math prettyprint quotations sequences ;" "[ + ] [ literalize ] map ." "[ \\ + ]" }
62 { literalize curry <wrapper> POSTPONE: \ POSTPONE: W{ } related-words