classes: Add a check that arguments to classoids are themselves classoids.
Introduce a new word-prop that makes tuple-class words classoids at parse-time so that self-referential tuple definitions with maybe{} work, e.g. TUPLE: node { next maybe{ node } } ; Add unit test. Fixes #766.db4
parent
d802db939a
commit
5bcdeee745
|
@ -15,7 +15,19 @@ TUPLE: anonymous-union { members read-only } ;
|
|||
|
||||
INSTANCE: anonymous-union classoid
|
||||
|
||||
: <anonymous-union> ( members -- class )
|
||||
ERROR: not-classoids sequence ;
|
||||
|
||||
: check-classoids ( members -- members )
|
||||
dup [ classoid? ] all?
|
||||
[ [ classoid? not ] filter not-classoids ] unless ;
|
||||
|
||||
ERROR: not-a-classoid object ;
|
||||
|
||||
: check-classoid ( object -- object )
|
||||
dup classoid? [ not-a-classoid ] unless ;
|
||||
|
||||
: <anonymous-union> ( members -- classoid )
|
||||
check-classoids
|
||||
[ null eq? not ] filter set-members
|
||||
dup length 1 = [ first ] [ sort-classes f like anonymous-union boa ] if ;
|
||||
|
||||
|
@ -25,7 +37,8 @@ TUPLE: anonymous-intersection { participants read-only } ;
|
|||
|
||||
INSTANCE: anonymous-intersection classoid
|
||||
|
||||
: <anonymous-intersection> ( participants -- class )
|
||||
: <anonymous-intersection> ( participants -- classoid )
|
||||
check-classoids
|
||||
set-members dup length 1 =
|
||||
[ first ] [ sort-classes f like anonymous-intersection boa ] if ;
|
||||
|
||||
|
@ -35,7 +48,9 @@ TUPLE: anonymous-complement { class read-only } ;
|
|||
|
||||
INSTANCE: anonymous-complement classoid
|
||||
|
||||
C: <anonymous-complement> anonymous-complement
|
||||
: <anonymous-complement> ( object -- classoid )
|
||||
dup classoid? [ 1array not-classoids ] unless
|
||||
anonymous-complement boa ;
|
||||
|
||||
M: anonymous-complement rank-class drop 3 ;
|
||||
|
||||
|
|
|
@ -10,8 +10,11 @@ ERROR: bad-inheritance class superclass ;
|
|||
|
||||
PREDICATE: class < word "class" word-prop ;
|
||||
|
||||
PREDICATE: defining-class < word "defining-class" word-prop ;
|
||||
|
||||
MIXIN: classoid
|
||||
INSTANCE: class classoid
|
||||
INSTANCE: defining-class classoid
|
||||
|
||||
<PRIVATE
|
||||
|
||||
|
@ -52,6 +55,7 @@ GENERIC: reset-class ( class -- )
|
|||
|
||||
M: class reset-class
|
||||
{
|
||||
"defining-class"
|
||||
"class"
|
||||
"metaclass"
|
||||
"superclass"
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
! Copyright (C) 2011 Doug Coleman.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: classes.maybe eval generic.single kernel tools.test
|
||||
math classes accessors slots classes.algebra ;
|
||||
math classes accessors slots classes.algebra
|
||||
classes.algebra.private ;
|
||||
IN: classes.maybe.tests
|
||||
|
||||
[ t ] [ 3 maybe{ integer } instance? ] unit-test
|
||||
|
@ -64,3 +65,6 @@ M: f lol2 drop "lol22" ;
|
|||
|
||||
[ t ] [ \ + <maybe> classoid? ] unit-test
|
||||
[ f ] [ \ + <maybe> valid-classoid? ] unit-test
|
||||
|
||||
[ "IN: classes-tests maybe{ 1 2 3 }" eval( -- ) ]
|
||||
[ error>> not-classoids? ] must-fail-with
|
||||
|
|
|
@ -8,6 +8,7 @@ IN: classes.parser
|
|||
|
||||
: create-class-in ( string -- word )
|
||||
current-vocab create
|
||||
dup t "defining-class" set-word-prop
|
||||
dup set-word
|
||||
dup save-class-location
|
||||
dup create-predicate-word save-location ;
|
||||
|
|
|
@ -238,10 +238,12 @@ M: tuple-class update-class
|
|||
} cleave ;
|
||||
|
||||
: define-new-tuple-class ( class superclass slots -- )
|
||||
[ drop f f tuple-class define-class ]
|
||||
[ nip "slots" set-word-prop ]
|
||||
[ 2drop update-classes ]
|
||||
3tri ;
|
||||
{
|
||||
[ drop f f tuple-class define-class ]
|
||||
[ nip "slots" set-word-prop ]
|
||||
[ 2drop update-classes ]
|
||||
[ 2drop f "defining-class" set-word-prop ]
|
||||
} 3cleave ;
|
||||
|
||||
: subclasses ( class -- classes )
|
||||
class-usages [ tuple-class? ] filter ;
|
||||
|
|
Loading…
Reference in New Issue