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.
"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
"f" "syntax" create [ not ] "predicate" set-word-prop
@ -353,15 +353,15 @@ define-class
! Catch-all class for providing a default method.
"object" "kernel" create [ drop t ] "predicate" set-word-prop
"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
"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" "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
"tombstone" "hashtables.private" create

View File

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

View File

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

View File

@ -36,7 +36,7 @@ PREDICATE: union-class < class
M: union-class update-predicate define-union-predicate ;
: 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
{ "metaclass" "members" } reset-props ;

View File

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