Working on classes
parent
ad0e11d9d3
commit
d8abb49a9b
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue