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
|
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
|
[ null eq? not ] filter set-members
|
||||||
dup length 1 = [ first ] [ sort-classes f like anonymous-union boa ] if ;
|
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
|
INSTANCE: anonymous-intersection classoid
|
||||||
|
|
||||||
: <anonymous-intersection> ( participants -- class )
|
: <anonymous-intersection> ( participants -- classoid )
|
||||||
|
check-classoids
|
||||||
set-members dup length 1 =
|
set-members dup length 1 =
|
||||||
[ first ] [ sort-classes f like anonymous-intersection boa ] if ;
|
[ first ] [ sort-classes f like anonymous-intersection boa ] if ;
|
||||||
|
|
||||||
|
@ -35,7 +48,9 @@ TUPLE: anonymous-complement { class read-only } ;
|
||||||
|
|
||||||
INSTANCE: anonymous-complement classoid
|
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 ;
|
M: anonymous-complement rank-class drop 3 ;
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,11 @@ ERROR: bad-inheritance class superclass ;
|
||||||
|
|
||||||
PREDICATE: class < word "class" word-prop ;
|
PREDICATE: class < word "class" word-prop ;
|
||||||
|
|
||||||
|
PREDICATE: defining-class < word "defining-class" word-prop ;
|
||||||
|
|
||||||
MIXIN: classoid
|
MIXIN: classoid
|
||||||
INSTANCE: class classoid
|
INSTANCE: class classoid
|
||||||
|
INSTANCE: defining-class classoid
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
@ -52,6 +55,7 @@ GENERIC: reset-class ( class -- )
|
||||||
|
|
||||||
M: class reset-class
|
M: class reset-class
|
||||||
{
|
{
|
||||||
|
"defining-class"
|
||||||
"class"
|
"class"
|
||||||
"metaclass"
|
"metaclass"
|
||||||
"superclass"
|
"superclass"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
! Copyright (C) 2011 Doug Coleman.
|
! Copyright (C) 2011 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: classes.maybe eval generic.single kernel tools.test
|
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
|
IN: classes.maybe.tests
|
||||||
|
|
||||||
[ t ] [ 3 maybe{ integer } instance? ] unit-test
|
[ t ] [ 3 maybe{ integer } instance? ] unit-test
|
||||||
|
@ -64,3 +65,6 @@ M: f lol2 drop "lol22" ;
|
||||||
|
|
||||||
[ t ] [ \ + <maybe> classoid? ] unit-test
|
[ t ] [ \ + <maybe> classoid? ] unit-test
|
||||||
[ f ] [ \ + <maybe> valid-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 )
|
: create-class-in ( string -- word )
|
||||||
current-vocab create
|
current-vocab create
|
||||||
|
dup t "defining-class" set-word-prop
|
||||||
dup set-word
|
dup set-word
|
||||||
dup save-class-location
|
dup save-class-location
|
||||||
dup create-predicate-word save-location ;
|
dup create-predicate-word save-location ;
|
||||||
|
|
|
@ -238,10 +238,12 @@ M: tuple-class update-class
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
: define-new-tuple-class ( class superclass slots -- )
|
: define-new-tuple-class ( class superclass slots -- )
|
||||||
[ drop f f tuple-class define-class ]
|
{
|
||||||
[ nip "slots" set-word-prop ]
|
[ drop f f tuple-class define-class ]
|
||||||
[ 2drop update-classes ]
|
[ nip "slots" set-word-prop ]
|
||||||
3tri ;
|
[ 2drop update-classes ]
|
||||||
|
[ 2drop f "defining-class" set-word-prop ]
|
||||||
|
} 3cleave ;
|
||||||
|
|
||||||
: subclasses ( class -- classes )
|
: subclasses ( class -- classes )
|
||||||
class-usages [ tuple-class? ] filter ;
|
class-usages [ tuple-class? ] filter ;
|
||||||
|
|
Loading…
Reference in New Issue