55 lines
1.4 KiB
Factor
55 lines
1.4 KiB
Factor
! Copyright (C) 2004, 2008 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors classes classes.algebra words kernel
|
|
kernel.private namespaces sequences math math.private
|
|
combinators assocs ;
|
|
IN: classes.builtin
|
|
|
|
SYMBOL: builtins
|
|
|
|
PREDICATE: builtin-class < class
|
|
"metaclass" word-prop builtin-class eq? ;
|
|
|
|
: type>class ( n -- class ) builtins get-global nth ;
|
|
|
|
: class>type ( class -- n ) "type" word-prop ; foldable
|
|
|
|
: bootstrap-type>class ( n -- class ) builtins get nth ;
|
|
|
|
M: hi-tag class hi-tag type>class ;
|
|
|
|
M: object class tag type>class ;
|
|
|
|
M: builtin-class rank-class drop 0 ;
|
|
|
|
: builtin-instance? ( object n -- ? )
|
|
#! 7 == tag-mask get
|
|
#! 3 == hi-tag tag-number
|
|
dup 7 fixnum<= [ swap tag eq? ] [
|
|
swap dup tag 3 eq?
|
|
[ hi-tag eq? ] [ 2drop f ] if
|
|
] if ; inline
|
|
|
|
M: builtin-class instance?
|
|
class>type builtin-instance? ;
|
|
|
|
M: builtin-class (flatten-class) dup set ;
|
|
|
|
M: builtin-class (classes-intersect?)
|
|
{
|
|
{ [ 2dup eq? ] [ 2drop t ] }
|
|
{ [ over builtin-class? ] [ 2drop f ] }
|
|
[ swap classes-intersect? ]
|
|
} cond ;
|
|
|
|
M: anonymous-intersection (flatten-class)
|
|
participants>> [ flatten-builtin-class ] map
|
|
[
|
|
builtins get sift [ (flatten-class) ] each
|
|
] [
|
|
unclip [ assoc-intersect ] reduce [ swap set ] assoc-each
|
|
] if-empty ;
|
|
|
|
M: anonymous-complement (flatten-class)
|
|
drop builtins get sift [ (flatten-class) ] each ;
|