more generic fixes

cvs
Slava Pestov 2005-08-15 03:26:40 +00:00
parent fae12b201e
commit 01b48675b7
7 changed files with 50 additions and 15 deletions

View File

@ -25,7 +25,7 @@ complement [
: define-complement ( class complement -- ) : define-complement ( class complement -- )
2dup "complement" set-word-prop 2dup "complement" set-word-prop
dupd complement-predicate "predicate" set-word-prop dupd complement-predicate "predicate" set-word-prop
dup complement-types "types" set-word-prop dup dup complement-types "types" set-word-prop
complement define-class ; complement define-class ;
PREDICATE: word complement metaclass complement = ; PREDICATE: word complement metaclass complement = ;

View File

@ -26,21 +26,40 @@ math-internals ;
: set-vtable ( definition class vtable -- ) : set-vtable ( definition class vtable -- )
>r types first r> set-nth ; >r types first r> set-nth ;
: 2types ( class class -- seq seq ) : 2types ( class class -- seq seq ) swap types swap types ;
swap types swap types ;
: class< ( cls1 cls2 -- ? ) : (class<) 2types contained? ;
#! Test if class1 is a subclass of class2.
: superclass? ( cls1 cls2 -- ? )
#! Is cls1 a superclass of cls2?
2dup eq? [ 2dup eq? [
2drop t 2drop t
] [ ] [
2dup "superclass" word-prop dup [ "superclass" word-prop dup [
swap class< not 2nip superclass?
] [ ] [
2drop 2types contained? 2drop f
] ifte ] ifte
] ifte ; ] ifte ;
: child-has-super? ( cls1 cls2 -- ? )
swap "superclass" word-prop not
swap "superclass" word-prop and ;
: both-have-super? ( cls1 cls2 -- ? )
swap "superclass" word-prop
swap "superclass" word-prop and ;
: custom-class< metaclass "class<" word-prop ;
: class< ( cls1 cls2 -- ? )
#! Test if class1 is a subclass of class2.
{
{ [ 2dup eq? ] [ 2drop t ] }
{ [ dup custom-class< ] [ dup custom-class< call ] }
{ [ t ] [ (class<) ] }
} cond ;
: class-compare ( cls1 cls2 -- -1/0/1 ) : class-compare ( cls1 cls2 -- -1/0/1 )
2dup eq? [ 2drop 0 ] [ class< 1 -1 ? ] ifte ; 2dup eq? [ 2drop 0 ] [ class< 1 -1 ? ] ifte ;
@ -50,6 +69,12 @@ math-internals ;
: order ( generic -- list ) : order ( generic -- list )
"methods" word-prop hash-keys [ class-compare ] sort ; "methods" word-prop hash-keys [ class-compare ] sort ;
: min-class ( class seq -- class/f )
#! Is this class the smallest class in the sequence?
[ dupd class-and null = not ] subset
[ class-compare neg ] sort
tuck [ class< ] all-with? [ first ] [ drop f ] ifte ;
: add-method ( generic vtable definition class -- ) : add-method ( generic vtable definition class -- )
#! Add the method entry to the vtable. Unlike define-method, #! Add the method entry to the vtable. Unlike define-method,
#! this is called at vtable build time, and in the sorted #! this is called at vtable build time, and in the sorted
@ -65,6 +90,8 @@ math-internals ;
: error-method ( generic -- method ) : error-method ( generic -- method )
[ dup picker% literalize , \ no-method , ] make-list ; [ dup picker% literalize , \ no-method , ] make-list ;
DEFER: delegate
: empty-method ( generic -- method ) : empty-method ( generic -- method )
dup "picker" word-prop [ dup ] = [ dup "picker" word-prop [ dup ] = [
[ [

View File

@ -27,6 +27,14 @@ predicate [
] each 2drop 2drop ] each 2drop 2drop
] "add-method" set-word-prop ] "add-method" set-word-prop
predicate [
over metaclass over metaclass eq? [
>r "superclass" word-prop r> class<
] [
drop types empty?
] ifte
] "class<" set-word-prop
: define-predicate-class ( class predicate definition -- ) : define-predicate-class ( class predicate definition -- )
3dup nip "definition" set-word-prop 3dup nip "definition" set-word-prop
pick predicate "metaclass" set-word-prop pick predicate "metaclass" set-word-prop

View File

@ -185,6 +185,8 @@ tuple [
2drop add-tuple-dispatch 2drop add-tuple-dispatch
] "add-method" set-word-prop ] "add-method" set-word-prop
tuple [ 2drop f ] "class<" set-word-prop
PREDICATE: word tuple-class metaclass tuple = ; PREDICATE: word tuple-class metaclass tuple = ;
: is? ( obj pred -- ? | pred: obj -- ? ) : is? ( obj pred -- ? | pred: obj -- ? )

View File

@ -6,12 +6,6 @@ vectors words ;
! Method inlining optimization ! Method inlining optimization
: min-class ( class seq -- class/f )
#! Is this class the smallest class in the sequence?
[ dupd class-and null = not ] subset
[ class-compare neg ] sort
tuck [ class< ] all-with? [ first ] [ drop f ] ifte ;
GENERIC: dispatching-values ( node word -- seq ) GENERIC: dispatching-values ( node word -- seq )
M: object dispatching-values 2drop { } ; M: object dispatching-values 2drop { } ;

View File

@ -10,6 +10,7 @@ USE: math
USE: kernel USE: kernel
USE: lists USE: lists
USE: sequences USE: sequences
USE: prettyprint
! Some dataflow tests ! Some dataflow tests
! [ 3 ] [ 1 2 3 (subst-value) ] unit-test ! [ 3 ] [ 1 2 3 (subst-value) ] unit-test
@ -87,7 +88,7 @@ USE: sequences
! Test method inlining ! Test method inlining
[ string ] [ [ string ] [
\ string \ string
[ range repeated integer string mirror array reversed sbuf [ repeated integer string mirror array reversed sbuf
slice vector diagonal general-list ] slice vector diagonal general-list ]
min-class min-class
] unit-test ] unit-test

View File

@ -108,6 +108,9 @@ M: very-funny gooey sq ;
[ f ] [ \ cons \ list class< ] unit-test [ f ] [ \ cons \ list class< ] unit-test
[ f ] [ \ list \ cons class< ] unit-test [ f ] [ \ list \ cons class< ] unit-test
[ f ] [ \ mirror \ slice class< ] unit-test
[ f ] [ \ slice \ mirror class< ] unit-test
DEFER: bah DEFER: bah
FORGET: bah FORGET: bah
UNION: bah fixnum alien ; UNION: bah fixnum alien ;