: type-union ( list list -- list )
append prune [ > ] sort ;
+: type-intersection ( list list -- list )
+ intersection [ > ] sort ;
+
: class-or ( class class -- class )
#! Return a class that both classes are subclasses of.
swap builtin-supertypes
#! error if this is impossible.
over builtin-supertypes
over builtin-supertypes
- intersection dup [
+ type-intersection dup [
nip nip classes get hash [ object ] unless*
] [
drop [
dup builtin-supertypes [ > ] sort
classes get set-hash ;
-global [ <namespace> classes set ] bind
+global [ classes get [ <namespace> classes set ] unless ] bind
[ integer ] [ fixnum bignum class-or ] unit-test
[ integer ] [ fixnum integer class-or ] unit-test
[ rational ] [ ratio integer class-or ] unit-test
+[ number ] [ number object class-and ] unit-test
+[ number ] [ object number class-and ] unit-test
[ [ [ cons ] [ cons ] ] ] [ [ uncons cons ] infer ] unit-test
[ [ [ object ] [ object ] ] ] [ [ dup [ car ] when ] infer ] unit-test
[ [ [ vector ] [ vector ] ] ] [ [ vector-clone ] infer ] unit-test
+[ [ [ number ] [ number ] ] ] [ [ dup + ] infer ] unit-test