"builtin-classes"
"unions"
"intersections"
+ "maybes"
"mixins"
"predicates"
"singletons"
--- /dev/null
+! Copyright (C) 2017 Alexander Ilin.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.markup help.syntax kernel ;
+IN: classes.maybe
+
+ABOUT: "maybes"
+
+ARTICLE: "maybes" "Maybe classes"
+"A " { $snippet "maybe" } " is an anonymous union class (" { $link "unions" } ") of its members and the " { $link POSTPONE: f } " class. An object is an instance of a " { $snippet "maybe" } " class if it is either an instance of any of its participants, or " { $link POSTPONE: f } "." $nl
+"The " { $snippet "maybe" } " classes are used to declare typed slots that are optional for a tuple. Without this mechanism it would be an error to assign " { $link POSTPONE: f } " to such a typed slot, and therefore any tuple containing them without specifying an " { $link POSTPONE: initial: } " value could not be created with the word " { $link new } "." $nl
+"A slot with an empty " { $snippet "maybe{ }" } " class can only hold the " { $link POSTPONE: f } " value."
+{ $examples
+ { $example
+ "TUPLE: test-maybe { value maybe{ fixnum string } } ;"
+ "test-maybe new value>>"
+ "f"
+ }
+}
+{ $see-also "unions" POSTPONE: maybe{ } ;
--- /dev/null
+Maybe classes
mixin-class?
}
"Mixins are used to defines suites of behavior which are generally useful and can be applied to user-defined classes. For example, the " { $link immutable-sequence } " mixin can be used with user-defined sequences to make them immutable."
-{ $see-also "unions" "tuple-subclassing" } ;
+{ $see-also "unions" "maybes" "tuple-subclassing" } ;
HELP: mixin-class
{ $class-description "The class of mixin classes." } ;
{ "The " { $link slots>tuple } " and " { $link >tuple } " words ensure that the values in the sequence satisfy the correct class predicates." }
{ { $link "tuple-redefinition" } " fills in new slots with initial values and ensures that changes to existing declarations result in incompatible values being replaced with the initial value of their respective slots." }
}
-{ $subsections "slot-class-coercion" } ;
+{ $subsections "slot-class-coercion" }
+"The " { $link "maybes" } " are a useful way to specify class for an optional slot." ;
ARTICLE: "slot-class-coercion" "Coercive slot declarations"
"If the class of a slot is declared to be one of " { $link fixnum } " or " { $link float } ", then rather than testing values with the class predicate, writer words coerce values to the relevant type with " { $link >fixnum } " or " { $link >float } ". This may still result in error, but permits a wider range of values than a class predicate test. It also results in a possible loss of precision; for example, storing a large integer into a " { $link fixnum } " slot will silently overflow and discard high bits, and storing a ratio into a " { $link float } " slot may lose precision if the ratio is one which cannot be represented exactly with floating-point."
}
"Declaring a tuple class final prohibits other classes from subclassing it:"
{ $subsections POSTPONE: final }
-{ $see-also "call-next-method" "parameterized-constructors" "unions" "mixins" } ;
+{ $see-also "call-next-method" "parameterized-constructors" "unions" "mixins" "maybes" } ;
ARTICLE: "tuple-introspection" "Tuple introspection"
"In addition to the slot reader and writer words which " { $link POSTPONE: TUPLE: } " defines for every tuple class, it is possible to construct and take apart entire tuples in a generic way."
union-class?
}
"Unions are used to define behavior shared between a fixed set of classes, as well as to conveniently define predicates."
-{ $see-also "mixins" "tuple-subclassing" } ;
+{ $see-also "mixins" "maybes" "tuple-subclassing" } ;
ABOUT: "unions"
{ { { $snippet "\"superclass\"" } ", " { $snippet "\"predicate-definition\"" } } { $link "predicates" } }
- { { $snippet "\"members\"" } { $link "unions" } }
+ { { $snippet "\"members\"" } { $link "unions" } { $link "maybes" } }
{ { $snippet "\"slots\"" } { $link "slots" } }