1 USING: help.syntax help.markup ;
5 { $values { "wordlist" "a sequence of words" } { "protocol" "a word for the new protocol" } }
6 { $description "Defines a symbol as a protocol." }
7 { $notes "Usually, " { $link POSTPONE: PROTOCOL: } " should be used instead. This is only for runtime use." } ;
10 { $syntax "PROTOCOL: protocol-name words... ;" }
11 { $description "Defines an explicit protocol, which can be used as a basis for delegation or mimicry." } ;
13 { define-protocol POSTPONE: PROTOCOL: } related-words
16 { $values { "class" "a class" } { "group" "a protocol, generic word or tuple class" } { "quot" "a quotation" } }
17 { $description "Defines a class to consult, using the given quotation, on the generic words contained in the group." }
18 { $notes "Usually, " { $link POSTPONE: CONSULT: } " should be used instead. This is only for runtime use." } ;
21 { $syntax "CONSULT: group class getter... ;" }
22 { $values { "group" "a protocol, generic word or tuple class" } { "class" "a class" } { "getter" "code to get where the method should be forwarded" } }
23 { $description "Defines a class to consult, using the given code, on the generic words contained in the group. This means that, when one of the words in the group is called on an object of this class, the quotation will be called, and then the generic word called again. If the getter is empty, this will cause an infinite loop. Consultation overwrites the existing methods, but others can be defined afterwards." } ;
25 { define-consult POSTPONE: CONSULT: } related-words
28 { $values { "group" "a group" } { "words" "an array of words" } }
29 { $description "Given a protocol or tuple class, this returns the corresponding generic words that this group contains." } ;
31 ARTICLE: "delegate" "Delegation"
32 "The " { $vocab-link "delegate" } " vocabulary implements run-time consultation for method dispatch."
34 "A " { $emphasis "protocol" } " is a collection of related generic words. An object is said to " { $emphasis "consult" } " another object if it implements a protocol by forwarding all methods onto the other object."
36 "Using this vocabulary, protocols can be defined and consulation can be set up without any repetitive boilerplate."
38 "Unlike " { $link "tuple-subclassing" } ", which expresses " { $emphasis "is-a" } " relationships by statically including the methods and slots of the superclass in all subclasses, consultation forwards generic word calls to another distinct object."
40 "Defining new protocols:"
41 { $subsection POSTPONE: PROTOCOL: }
42 { $subsection define-protocol }
43 "Defining consultation:"
44 { $subsection POSTPONE: CONSULT: }
45 { $subsection define-consult }
46 "Every tuple class has an associated protocol consisting of all of its slot accessor methods. The " { $vocab-link "delegate.protocols" } " vocabulary defines formal protocols for the various informal protocols used in the Factor core, such as " { $link "sequence-protocol" } ", " { $link "assocs-protocol" } " or " { $link "stream-protocol" } ;