] if ; inline
: tuple>assoc ( tuple -- assoc )
- [ class all-slots ] [ tuple-slots ] bi zip
+ [ class class-slots ] [ object-slots ] bi zip
[ [ initial>> ] dip = not ] assoc-filter
[ [ name>> ] dip ] assoc-map ;
M: wrapper >pprint-sequence wrapped>> 1array ;
M: callstack >pprint-sequence callstack>array ;
-M: tuple >pprint-sequence
- [ class ] [ tuple-slots ] bi
+: class-slot-sequence ( class slots -- sequence )
[ 1array ] [ [ f 2array ] dip append ] if-empty ;
+M: tuple >pprint-sequence
+ [ class ] [ object-slots ] bi class-slot-sequence ;
+
M: object pprint-narrow? drop f ;
M: byte-vector pprint-narrow? drop f ;
M: array pprint-narrow? drop t ;
: all-slots ( class -- slots )
superclasses [ "slots" word-prop ] map concat ;
+GENERIC: class-slots ( class -- slots )
+
+M: tuple-class class-slots
+ all-slots ;
+
PREDICATE: immutable-tuple-class < tuple-class ( class -- ? )
all-slots [ read-only>> ] all? ;
: tuple-slots ( tuple -- seq )
prepare-tuple>array drop copy-tuple-slots ;
+GENERIC: object-slots ( object -- seq )
+M: tuple object-slots
+ tuple-slots ;
+
GENERIC: slots>tuple ( seq class -- tuple )
M: tuple-class slots>tuple ( seq class -- tuple )
USING: accessors alien alien.c-types byte-arrays classes
classes.c-types classes.parser classes.tuple
classes.tuple.parser classes.tuple.private combinators
-combinators.smart fry generalizations kernel kernel.private
-libc macros make math math.order quotations sequences slots
-slots.private words ;
+combinators.smart fry generalizations generic.parser kernel
+kernel.private libc macros make math math.order quotations
+sequences slots slots.private words ;
IN: classes.struct
! struct class
M: struct-class writer-quot
nip (writer-quot) ;
+M: struct-class class-slots
+ "struct-slots" word-prop ;
+
+: object-slots-quot ( class -- quot )
+ "struct-slots" word-prop
+ [ name>> reader-word 1quotation ] map
+ \ cleave [ ] 2sequence
+ \ output>array [ ] 2sequence ;
+
+: (define-object-slots-method) ( class -- )
+ [ \ object-slots create-method-in ]
+ [ object-slots-quot ] bi define ;
+
! Struct as c-type
: align-offset ( offset class -- offset' )
make-slots dup
[ check-struct-slots ] [ struct-offsets ] [ struct-align [ align ] keep ] tri
(define-struct-class)
- ] [ drop dup struct-prototype "prototype" set-word-prop ] 2tri ;
+ ] [
+ drop
+ [ dup struct-prototype "prototype" set-word-prop ]
+ [ (define-object-slots-method) ] bi
+ ] 2tri ;
: parse-struct-definition ( -- class slots )
CREATE-CLASS [ parse-tuple-slots ] { } make ;