Clean up class algebra a bit, and change mixins to recompile less, taking advantage of new semantics
parent
d58f73453f
commit
e6d1388dcc
|
@ -126,6 +126,9 @@ call( -- )
|
||||||
prepare-slots make-slots 1 finalize-slots
|
prepare-slots make-slots 1 finalize-slots
|
||||||
[ "slots" set-word-prop ] [ define-accessors ] 2bi ;
|
[ "slots" set-word-prop ] [ define-accessors ] 2bi ;
|
||||||
|
|
||||||
|
: define-builtin-predicate ( class -- )
|
||||||
|
dup class>type [ eq? ] curry [ tag ] prepend define-predicate ;
|
||||||
|
|
||||||
: define-builtin ( symbol slotspec -- )
|
: define-builtin ( symbol slotspec -- )
|
||||||
[ [ define-builtin-predicate ] keep ] dip define-builtin-slots ;
|
[ [ define-builtin-predicate ] keep ] dip define-builtin-slots ;
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ MIXIN: empty-mixin
|
||||||
! classes-intersect?
|
! classes-intersect?
|
||||||
[ t ] [ both tuple classes-intersect? ] unit-test
|
[ t ] [ both tuple classes-intersect? ] unit-test
|
||||||
|
|
||||||
[ t ] [ vector virtual-sequence classes-intersect? ] unit-test
|
[ f ] [ vector virtual-sequence classes-intersect? ] unit-test
|
||||||
|
|
||||||
[ t ] [ number vector class-or sequence classes-intersect? ] unit-test
|
[ t ] [ number vector class-or sequence classes-intersect? ] unit-test
|
||||||
|
|
||||||
|
@ -192,11 +192,11 @@ MIXIN: empty-mixin
|
||||||
[ t ] [ union-with-one-member object classes-intersect? ] unit-test
|
[ t ] [ union-with-one-member object classes-intersect? ] unit-test
|
||||||
|
|
||||||
[ t ] [ a mixin-with-one-member classes-intersect? ] unit-test
|
[ t ] [ a mixin-with-one-member classes-intersect? ] unit-test
|
||||||
[ t ] [ fixnum mixin-with-one-member classes-intersect? ] unit-test
|
[ f ] [ fixnum mixin-with-one-member classes-intersect? ] unit-test
|
||||||
[ t ] [ object mixin-with-one-member classes-intersect? ] unit-test
|
[ t ] [ object mixin-with-one-member classes-intersect? ] unit-test
|
||||||
|
|
||||||
[ t ] [ mixin-with-one-member a classes-intersect? ] unit-test
|
[ t ] [ mixin-with-one-member a classes-intersect? ] unit-test
|
||||||
[ t ] [ mixin-with-one-member fixnum classes-intersect? ] unit-test
|
[ f ] [ mixin-with-one-member fixnum classes-intersect? ] unit-test
|
||||||
[ t ] [ mixin-with-one-member object classes-intersect? ] unit-test
|
[ t ] [ mixin-with-one-member object classes-intersect? ] unit-test
|
||||||
|
|
||||||
! class=
|
! class=
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
! Copyright (C) 2004, 2008 Slava Pestov.
|
! Copyright (C) 2004, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors classes classes.algebra classes.algebra.private
|
USING: accessors classes classes.algebra classes.algebra.private
|
||||||
words kernel kernel.private namespaces sequences math
|
words kernel kernel.private namespaces sequences math
|
||||||
|
@ -20,11 +20,6 @@ M: object class tag type>class ; inline
|
||||||
|
|
||||||
M: builtin-class rank-class drop 0 ;
|
M: builtin-class rank-class drop 0 ;
|
||||||
|
|
||||||
GENERIC: define-builtin-predicate ( class -- )
|
|
||||||
|
|
||||||
M: builtin-class define-builtin-predicate
|
|
||||||
dup class>type [ eq? ] curry [ tag ] prepend define-predicate ;
|
|
||||||
|
|
||||||
M: builtin-class instance? [ tag ] [ class>type ] bi* eq? ;
|
M: builtin-class instance? [ tag ] [ class>type ] bi* eq? ;
|
||||||
|
|
||||||
M: builtin-class (flatten-class) dup set ;
|
M: builtin-class (flatten-class) dup set ;
|
||||||
|
|
|
@ -8,6 +8,8 @@ IN: classes.intersection
|
||||||
PREDICATE: intersection-class < class
|
PREDICATE: intersection-class < class
|
||||||
"metaclass" word-prop intersection-class eq? ;
|
"metaclass" word-prop intersection-class eq? ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
: intersection-predicate-quot ( members -- quot )
|
: intersection-predicate-quot ( members -- quot )
|
||||||
[
|
[
|
||||||
[ drop t ]
|
[ drop t ]
|
||||||
|
@ -23,11 +25,6 @@ PREDICATE: intersection-class < class
|
||||||
|
|
||||||
M: intersection-class update-class define-intersection-predicate ;
|
M: intersection-class update-class define-intersection-predicate ;
|
||||||
|
|
||||||
: define-intersection-class ( class participants -- )
|
|
||||||
[ [ f f ] dip intersection-class define-class ]
|
|
||||||
[ drop update-classes ]
|
|
||||||
2bi ;
|
|
||||||
|
|
||||||
M: intersection-class rank-class drop 2 ;
|
M: intersection-class rank-class drop 2 ;
|
||||||
|
|
||||||
M: intersection-class instance?
|
M: intersection-class instance?
|
||||||
|
@ -50,3 +47,10 @@ M: anonymous-intersection (flatten-class)
|
||||||
[ intersect-flattened-classes ] map-reduce
|
[ intersect-flattened-classes ] map-reduce
|
||||||
[ dup set ] each
|
[ dup set ] each
|
||||||
] if-empty ;
|
] if-empty ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: define-intersection-class ( class participants -- )
|
||||||
|
[ [ f f ] dip intersection-class define-class ]
|
||||||
|
[ drop update-classes ]
|
||||||
|
2bi ;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
! Copyright (C) 2004, 2010 Slava Pestov.
|
! Copyright (C) 2004, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: classes classes.algebra classes.algebra.private
|
USING: classes classes.algebra classes.algebra.private
|
||||||
classes.union words kernel sequences definitions combinators
|
classes.union classes.union.private words kernel sequences
|
||||||
arrays assocs generic accessors ;
|
definitions combinators arrays assocs generic accessors ;
|
||||||
IN: classes.mixin
|
IN: classes.mixin
|
||||||
|
|
||||||
PREDICATE: mixin-class < union-class "mixin" word-prop ;
|
PREDICATE: mixin-class < union-class "mixin" word-prop ;
|
||||||
|
@ -46,40 +46,35 @@ TUPLE: check-mixin-class class ;
|
||||||
[ [ members swap bootstrap-word ] dip call ] [ drop ] 2bi
|
[ [ members swap bootstrap-word ] dip call ] [ drop ] 2bi
|
||||||
swap redefine-mixin-class ; inline
|
swap redefine-mixin-class ; inline
|
||||||
|
|
||||||
: update-classes/new ( mixin -- )
|
: update-mixin-class ( member mixin -- )
|
||||||
class-usages
|
class-usages
|
||||||
|
[ update-methods ]
|
||||||
[ [ update-class ] each ]
|
[ [ update-class ] each ]
|
||||||
[ implementors [ remake-generic ] each ] bi ;
|
[ implementors [ remake-generic ] each ]
|
||||||
|
tri ;
|
||||||
|
|
||||||
: (add-mixin-instance) ( class mixin -- )
|
: (add-mixin-instance) ( class mixin -- )
|
||||||
[ [ suffix ] change-mixin-class ]
|
[ [ suffix ] change-mixin-class ]
|
||||||
[ [ f ] 2dip "instances" word-prop set-at ]
|
[ [ f ] 2dip "instances" word-prop set-at ]
|
||||||
2bi ;
|
[ update-mixin-class ]
|
||||||
|
2tri ;
|
||||||
|
|
||||||
GENERIC# add-mixin-instance 1 ( class mixin -- )
|
GENERIC# add-mixin-instance 1 ( class mixin -- )
|
||||||
|
|
||||||
M: class add-mixin-instance
|
M: class add-mixin-instance
|
||||||
[ 2drop ] [
|
[ 2drop ] [ (add-mixin-instance) ] if-mixin-member? ;
|
||||||
[ (add-mixin-instance) ] 2keep
|
|
||||||
[ nip ] [ [ new-class? ] either? ] 2bi
|
|
||||||
[ update-classes/new ] [ update-classes ] if
|
|
||||||
] if-mixin-member? ;
|
|
||||||
|
|
||||||
: (remove-mixin-instance) ( class mixin -- )
|
: (remove-mixin-instance) ( class mixin -- )
|
||||||
[ [ swap remove ] change-mixin-class ]
|
[ [ swap remove ] change-mixin-class ]
|
||||||
[ "instances" word-prop delete-at ]
|
[ "instances" word-prop delete-at ]
|
||||||
2bi ;
|
[ update-mixin-class ]
|
||||||
|
2tri ;
|
||||||
|
|
||||||
: remove-mixin-instance ( class mixin -- )
|
: remove-mixin-instance ( class mixin -- )
|
||||||
#! The order of the three clauses is important here. The last
|
#! The order of the three clauses is important here. The last
|
||||||
#! one must come after the other two so that the entries it
|
#! one must come after the other two so that the entries it
|
||||||
#! adds to changed-generics are not overwritten.
|
#! adds to changed-generics are not overwritten.
|
||||||
[
|
[ (remove-mixin-instance) ] [ 2drop ] if-mixin-member? ;
|
||||||
[ (remove-mixin-instance) ]
|
|
||||||
[ nip update-classes ]
|
|
||||||
[ class-usages update-methods ]
|
|
||||||
2tri
|
|
||||||
] [ 2drop ] if-mixin-member? ;
|
|
||||||
|
|
||||||
M: mixin-class class-forgotten remove-mixin-instance ;
|
M: mixin-class class-forgotten remove-mixin-instance ;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
! Copyright (C) 2004, 2009 Slava Pestov.
|
! Copyright (C) 2004, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: classes classes.algebra classes.algebra.private kernel
|
USING: classes classes.algebra classes.algebra.private kernel
|
||||||
namespaces make words sequences quotations arrays kernel.private
|
namespaces make words sequences quotations arrays kernel.private
|
||||||
|
@ -8,6 +8,8 @@ IN: classes.predicate
|
||||||
PREDICATE: predicate-class < class
|
PREDICATE: predicate-class < class
|
||||||
"metaclass" word-prop predicate-class eq? ;
|
"metaclass" word-prop predicate-class eq? ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
GENERIC: predicate-quot ( class -- quot )
|
GENERIC: predicate-quot ( class -- quot )
|
||||||
|
|
||||||
M: predicate-class predicate-quot
|
M: predicate-class predicate-quot
|
||||||
|
@ -18,6 +20,8 @@ M: predicate-class predicate-quot
|
||||||
[ drop f ] , \ if ,
|
[ drop f ] , \ if ,
|
||||||
] [ ] make ;
|
] [ ] make ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
: define-predicate-class ( class superclass definition -- )
|
: define-predicate-class ( class superclass definition -- )
|
||||||
[ drop f f predicate-class define-class ]
|
[ drop f f predicate-class define-class ]
|
||||||
[ nip "predicate-definition" set-word-prop ]
|
[ nip "predicate-definition" set-word-prop ]
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
! Copyright (C) 2008, 2009 Doug Coleman, Slava Pestov.
|
! Copyright (C) 2008, 2010 Doug Coleman, Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: classes classes.algebra classes.algebra.private
|
USING: classes classes.algebra classes.algebra.private
|
||||||
classes.predicate kernel sequences words ;
|
classes.predicate classes.predicate.private kernel sequences
|
||||||
|
words ;
|
||||||
IN: classes.singleton
|
IN: classes.singleton
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
: singleton-predicate-quot ( class -- quot ) [ eq? ] curry ;
|
: singleton-predicate-quot ( class -- quot ) [ eq? ] curry ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
PREDICATE: singleton-class < predicate-class
|
PREDICATE: singleton-class < predicate-class
|
||||||
[ "predicate-definition" word-prop ]
|
[ "predicate-definition" word-prop ]
|
||||||
[ singleton-predicate-quot ]
|
[ singleton-predicate-quot ]
|
||||||
|
|
|
@ -348,8 +348,7 @@ HELP: tuple-class
|
||||||
|
|
||||||
HELP: tuple=
|
HELP: tuple=
|
||||||
{ $values { "tuple1" tuple } { "tuple2" tuple } { "?" "a boolean" } }
|
{ $values { "tuple1" tuple } { "tuple2" tuple } { "?" "a boolean" } }
|
||||||
{ $description "Low-level tuple equality test. User code should use " { $link = } " instead." }
|
{ $description "Checks if two tuples have equal slot values. This is the default behavior of " { $link = } " on tuples, unless the tuple class subclasses " { $link identity-tuple } " or implements a method on " { $link equal? } ". In cases where equality has been redefined, this word can be used to get the default semantics if needed." } ;
|
||||||
{ $warning "This word is in the " { $vocab-link "classes.tuple.private" } " vocabulary because it does not do any type checking. Passing values which are not tuples can result in memory corruption." } ;
|
|
||||||
|
|
||||||
HELP: tuple
|
HELP: tuple
|
||||||
{ $class-description "The class of tuples. This class is further partitioned into disjoint subclasses; each tuple shape defined by " { $link POSTPONE: TUPLE: } " is a new class."
|
{ $class-description "The class of tuples. This class is further partitioned into disjoint subclasses; each tuple shape defined by " { $link POSTPONE: TUPLE: } " is a new class."
|
||||||
|
|
|
@ -8,6 +8,8 @@ IN: classes.union
|
||||||
PREDICATE: union-class < class
|
PREDICATE: union-class < class
|
||||||
"metaclass" word-prop union-class eq? ;
|
"metaclass" word-prop union-class eq? ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
: union-predicate-quot ( members -- quot )
|
: union-predicate-quot ( members -- quot )
|
||||||
[
|
[
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
|
@ -26,6 +28,8 @@ M: union-class update-class define-union-predicate ;
|
||||||
: (define-union-class) ( class members -- )
|
: (define-union-class) ( class members -- )
|
||||||
f swap f union-class define-class ;
|
f swap f union-class define-class ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
: define-union-class ( class members -- )
|
: define-union-class ( class members -- )
|
||||||
[ (define-union-class) ] [ drop update-classes ] 2bi ;
|
[ (define-union-class) ] [ drop update-classes ] 2bi ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue