Working on classes

db4
Slava Pestov 2008-03-28 22:59:48 -05:00
parent ad0e11d9d3
commit d8abb49a9b
5 changed files with 50 additions and 39 deletions

View File

@ -341,7 +341,7 @@ define-tuple-slots
! Define general-t type, which is any object that is not f. ! Define general-t type, which is any object that is not f.
"general-t" "kernel" create "general-t" "kernel" create
"f" "syntax" lookup builtins get remove [ ] subset f union-class f "f" "syntax" lookup builtins get remove [ ] subset union-class
define-class define-class
"f" "syntax" create [ not ] "predicate" set-word-prop "f" "syntax" create [ not ] "predicate" set-word-prop
@ -353,15 +353,15 @@ define-class
! Catch-all class for providing a default method. ! Catch-all class for providing a default method.
"object" "kernel" create [ drop t ] "predicate" set-word-prop "object" "kernel" create [ drop t ] "predicate" set-word-prop
"object" "kernel" create "object" "kernel" create
builtins get [ ] subset f union-class define-class f builtins get [ ] subset union-class define-class
! Class of objects with object tag ! Class of objects with object tag
"hi-tag" "classes.private" create "hi-tag" "classes.private" create
builtins get num-tags get tail f union-class define-class f builtins get num-tags get tail union-class define-class
! Null class with no instances. ! Null class with no instances.
"null" "kernel" create [ drop f ] "predicate" set-word-prop "null" "kernel" create [ drop f ] "predicate" set-word-prop
"null" "kernel" create { } f union-class define-class "null" "kernel" create f { } union-class define-class
! Create special tombstone values ! Create special tombstone values
"tombstone" "hashtables.private" create "tombstone" "hashtables.private" create

View File

@ -83,13 +83,12 @@ M: word reset-class drop ;
: update-map- ( class -- ) : update-map- ( class -- )
dup class-uses update-map get remove-vertex ; dup class-uses update-map get remove-vertex ;
PRIVATE> : define-class-props ( superclass members metaclass -- assoc )
: define-class-props ( members superclass metaclass -- assoc )
[ [
"metaclass" set [ dup [ bootstrap-word ] when "superclass" set ]
dup [ bootstrap-word ] when "superclass" set [ [ bootstrap-word ] map "members" set ]
[ bootstrap-word ] map "members" set [ "metaclass" set ]
tri*
] H{ } make-assoc ; ] H{ } make-assoc ;
: (define-class) ( word props -- ) : (define-class) ( word props -- )
@ -100,6 +99,8 @@ PRIVATE>
over "predicating" set-word-prop over "predicating" set-word-prop
t "class" set-word-prop ; t "class" set-word-prop ;
PRIVATE>
GENERIC: update-predicate ( class -- ) GENERIC: update-predicate ( class -- )
M: class update-predicate drop ; M: class update-predicate drop ;
@ -109,7 +110,7 @@ M: class update-predicate drop ;
GENERIC: update-methods ( assoc -- ) GENERIC: update-methods ( assoc -- )
: define-class ( word members superclass metaclass -- ) : define-class ( word superclass members metaclass -- )
#! If it was already a class, update methods after. #! If it was already a class, update methods after.
reset-caches reset-caches
define-class-props define-class-props

View File

@ -14,8 +14,8 @@ PREDICATE: predicate-class < class
] [ ] make ; ] [ ] make ;
: define-predicate-class ( class superclass definition -- ) : define-predicate-class ( class superclass definition -- )
>r >r dup f r> predicate-class define-class r> >r dupd f predicate-class define-class
dupd "predicate-definition" set-word-prop r> dupd "predicate-definition" set-word-prop
dup predicate-quot define-predicate ; dup predicate-quot define-predicate ;
M: predicate-class reset-class M: predicate-class reset-class

View File

@ -36,7 +36,7 @@ PREDICATE: union-class < class
M: union-class update-predicate define-union-predicate ; M: union-class update-predicate define-union-predicate ;
: define-union-class ( class members -- ) : define-union-class ( class members -- )
dupd f union-class define-class define-union-predicate ; >r dup f r> union-class define-class define-union-predicate ;
M: union-class reset-class M: union-class reset-class
{ "metaclass" "members" } reset-props ; { "metaclass" "members" } reset-props ;

View File

@ -124,7 +124,8 @@ PRIVATE>
[ [ swap ?nth ] [ drop f ] if* ] with map [ [ swap ?nth ] [ drop f ] if* ] with map
append >tuple ; append >tuple ;
: reshape-tuples ( class newslots -- ) : reshape-tuples ( class superclass newslots -- )
nip
>r dup "slot-names" word-prop r> permutation >r dup "slot-names" word-prop r> permutation
[ [
>r [ swap class eq? ] curry instances dup r> >r [ swap class eq? ] curry instances dup r>
@ -132,36 +133,45 @@ PRIVATE>
become become
] 2curry after-compilation ; ] 2curry after-compilation ;
: tuple-class-unchanged ( class superclass slots -- ) 3drop ; : define-new-tuple-class ( class superclass slots -- )
[ drop f tuple-class define-class ]
: prepare-tuple-class ( class slots -- ) [ nip define-tuple-slots ]
dupd define-tuple-slots [
dup define-tuple-layout 2drop
define-tuple-predicate ; [ define-tuple-layout ]
[ define-tuple-predicate ]
: change-superclass "not supported" throw ; bi
]
3tri ;
: redefine-tuple-class ( class superclass slots -- ) : redefine-tuple-class ( class superclass slots -- )
>r 2dup swap superclass eq? [ reshape-tuples ]
[ drop ] [ dupd change-superclass ] if r> [
2dup forget-slots drop
2dup reshape-tuples [ forget-slots ]
over changed-word [ drop changed-word ]
over redefined [ drop redefined ]
prepare-tuple-class ; 2tri
]
[ define-new-tuple-class ]
3tri ;
: define-new-tuple-class ( class superclass slots -- ) : tuple-class-unchanged? ( class superclass slots -- ? )
>r dupd f swap tuple-class define-class r> rot tuck
prepare-tuple-class ; [ "superclass" word-prop = ]
[ "slot-names" word-prop = ] 2bi* and ;
PRIVATE> PRIVATE>
: define-tuple-class ( class superclass slots -- ) GENERIC# define-tuple-class 2 ( class superclass slots -- )
{
{ [ pick tuple-class? not ] [ define-new-tuple-class ] } M: word define-tuple-class
{ [ pick "slot-names" word-prop over = ] [ tuple-class-unchanged ] } define-new-tuple-class ;
{ [ t ] [ redefine-tuple-class ] }
} cond ; M: tuple-class define-tuple-class
3dup tuple-class-unchanged?
[ 3dup redefine-tuple-class ] unless
3drop ;
: define-error-class ( class superclass slots -- ) : define-error-class ( class superclass slots -- )
pick >r define-tuple-class r> pick >r define-tuple-class r>