Module: internal Synopsis: Subclass types Author: Keith Playford Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND //// The subclass type // BOOTED define ... class ... end; define method initialize (x :: , #key, #all-keys) => () next-method(); instance?-iep(x) := simple-method-iep(subclass-instance?); end method; define method subclass (class :: ) make(, class: class) end method; define inline method limits (subc :: ) => (result == ) end method; //// Instance? relationships define method instance?-function (t :: ) => (m :: ) subclass-instance? end method; define constant subclass-instance? = method (x, sc :: ) => (v :: ); if (instance?(x, )) let x :: = x; // This should be automatic... subclass?(x, sc.subclass-class) else #f end if end method; //// Subtype? relationships // With other subclass types define method subtype? (subc1 :: , subc2 :: ) => (result :: ) subtype?(subc1.subclass-class, subc2.subclass-class) end method; define method subjunctive-subtype? (subc1 :: , subc2 :: , scu :: ) => (result :: ) subjunctive-subtype?(subc1.subclass-class, subc2.subclass-class, scu) end method; // With singletons define method subtype? (subc1 :: , s :: ) => (result == #f) #f end method; define method subtype? (s :: , subc :: ) => (result :: ) let obj = s.singleton-object; if (instance?(obj, )) let obj :: = obj; subtype?(obj, subc.subclass-class) else #f end if end method; define method subjunctive-subtype? (subc1 :: , s :: , scu :: ) => (result == #f) #f end method; define method subjunctive-subtype? (s :: , subc :: , scu :: ) => (result :: ) let obj = s.singleton-object; if (instance?(obj, )) let obj :: = obj; subtype?(obj, subc.subclass-class) else #f end if end method; // With classes define method subtype? (subc :: , c :: ) => (result :: ) // c == subtype?(, c) end method; define method subtype? (c :: , subc :: ) => (result :: ) c == & subc.subclass-class == end method; define method subjunctive-subtype? (subc :: , c :: , scu :: ) => (result :: ) // c == subtype?(, c) end method; define method subjunctive-subtype? (c :: , subc :: , scu :: ) => (result :: ) c == & subc.subclass-class == end method; //// disjoint-type relationships define method disjoint-types-1? (t1 :: , t2 :: , scu :: , dep :: ) => (well? :: ) disjoint-types-1?(t1.subclass-class, t2.subclass-class, scu, dep) end method; define method disjoint-types-1? (t1 :: , t2 :: , scu :: , dep :: ) => (well? :: ) disjoint-types-1?(, t2, scu, dep) end method; define method disjoint-types-1? (t1 :: , t2 :: , scu :: , dep :: ) => (well? :: ) disjoint-types-1?(, t1, scu, dep) end method; define method type-complete? (t :: ) => (well? :: ) type-complete?(subclass-class(t)) end method; define method map-congruency-classes (f :: , t :: ) => () map-congruency-classes(f, subclass-class(t)) end method; define method reduce-incomplete-classes (f :: , t :: , ans) => (ans) reduce-incomplete-classes(f, subclass-class(t), ans) end method; //// Preceding-specializer? relationships // TODO: OBSOLETE? /* define method preceding-specializer? (subc1 :: , subc2 :: , arg :: ) => (result :: ) precedes?(subc1.subclass-class, subc2.subclass-class, all-superclasses(arg)) end method; // We rule that all applicable subclass specializers precede applicable // metaclass specializers. define method preceding-specializer? (subc :: , class :: , arg :: ) => (result == #t) #t end method; */ ///// Potential instance relationships? define method has-instances? (class :: , subc :: , scu :: ) => (some? :: , all? :: ) let class? :: = subjunctive-subtype?(class, , scu); values(class?, class? & subclass-class(subc) == ) end method; // eof