HELP: class
{ $class-description "The class of all class words." } ;
+HELP: class-members
+{ $values { "class" class } { "seq" "a sequence of union members, or " { $link f } } }
+{ $description "If " { $snippet "class" } " is a union class, outputs a sequence of its member classes, otherwise outputs " { $link f } "." } ;
+
HELP: class-of
{ $values { "object" object } { "class" class } }
{ $description "Outputs an object's canonical class. While an object may be an instance of more than one class, the canonical class is either its built-in class, or if the object is a tuple, its tuple class." }
{ $examples { $example "USING: classes prettyprint ;" "1.0 class-of ." "float" } { $example "USING: classes prettyprint ;" "IN: scratchpad" "TUPLE: point x y z ;\nT{ point f 1 2 3 } class-of ." "point" } } ;
+HELP: class-usage
+{ $values { "class" class } { "seq" sequence } }
+{ $description "Lists all classes that uses or depends on this class." } ;
+
HELP: classes
{ $values { "seq" "a sequence of class words" } }
{ $description "Finds all class words in the dictionary." } ;
-HELP: update-map
-{ $var-description "Assoc mapping each class to a set of classes defined in terms of this class. The " { $link define-class } " word uses this information to update generic words when classes are redefined." } ;
+HELP: contained-classes
+{ $values { "obj" class } { "members" sequence } }
+{ $description "Lists all classes contained in the class." }
+{ $see-also all-contained-classes } ;
+
+HELP: define-predicate
+{ $values { "class" class } { "quot" quotation } }
+{ $description "Defines a predicate word for a class." }
+$low-level-note ;
HELP: predicate-def
{ $values { "obj" "a type object" } { "quot" quotation } }
{ $values { "word" word } { "predicate" "a predicate word" } }
{ $description "Suffixes the word's name with \"?\" and creates a word with that name in the same vocabulary as the word itself." } ;
-HELP: define-predicate
-{ $values { "class" class } { "quot" quotation } }
-{ $description "Defines a predicate word for a class." }
-$low-level-note ;
-
HELP: superclass-of
{ $values { "class" class } { "super" class } }
{ $description "Outputs the superclass of a class. All instances of this class are also instances of the superclass." }
}
} ;
-{ superclass-of superclasses-of subclass-of? } related-words
+HELP: update-map
+{ $var-description "Assoc mapping each class to a set of classes defined in terms of this class. The " { $link define-class } " word uses this information to update generic words when classes are redefined." }
+{ $see-also class-usage } ;
-HELP: class-members
-{ $values { "class" class } { "seq" "a sequence of union members, or " { $link f } } }
-{ $description "If " { $snippet "class" } " is a union class, outputs a sequence of its member classes, otherwise outputs " { $link f } "." } ;
+{ superclass-of superclasses-of subclass-of? } related-words
HELP: class-participants
{ $values { "class" class } { "seq" "a sequence of intersection participants, or " { $link f } } }
{ } [ "IN: classes.tests TUPLE: generic-predicate ;" eval( -- ) ] unit-test
{ f } [ \ generic-predicate? generic? ] unit-test
+
+! all-contained-classes
+{
+ { maybe{ integer } integer fixnum bignum }
+} [
+ { maybe{ integer } } all-contained-classes
+] unit-test
+
+! contained-classes
+{
+ { fixnum bignum }
+ { integer }
+} [
+ integer contained-classes
+ maybe{ integer } contained-classes
+] unit-test
+
+! make-class-props
+{
+ H{
+ { "superclass" f }
+ { "members" { fixnum } }
+ { "metaclass" f }
+ { "participants" { } }
+ }
+} [
+ f { fixnum } { } f make-class-props
+] unit-test
! Output f for non-classes to work with algebra code
dup class? [ "participants" word-prop ] [ drop f ] if ;
+GENERIC: contained-classes ( obj -- members )
+
+M: object contained-classes
+ "members" word-prop ;
+
+: all-contained-classes ( members -- members' )
+ dup dup [ contained-classes ] map concat sift append
+ 2dup set= [ drop members ] [ nip all-contained-classes ] if ;
+
GENERIC: implementors ( class/classes -- seq )
! update-map
ERROR: cannot-reference-self class members ;
-GENERIC: classes-contained-by ( obj -- members )
-
-M: union-class classes-contained-by ( union -- members )
- "members" word-prop [ f ] when-empty ;
-
-M: object classes-contained-by
- "members" word-prop [ f ] when-empty ;
-
: check-self-reference ( class members -- class members )
- 2dup [
- dup dup [ classes-contained-by ] map concat sift append
- 2dup set= [ 2drop f ] [ nip ] if
- ] follow concat
- member-eq? [ cannot-reference-self ] when ;
+ 2dup all-contained-classes member-eq? [ cannot-reference-self ] when ;
PRIVATE>