factor/basis/classes/struct/prettyprint/prettyprint.factor

53 lines
1.4 KiB
Factor
Raw Normal View History

! (c)Joe Groff bsd license
2009-08-30 21:46:31 -04:00
USING: accessors alien assocs classes classes.struct
combinators kernel math prettyprint.backend prettyprint.custom
prettyprint.sections see.private sequences strings words ;
IN: classes.struct.prettyprint
<PRIVATE
: struct-definer-word ( class -- word )
struct-slots dup length 2 >=
[ second offset>> 0 = \ UNION-STRUCT: \ STRUCT: ? ]
[ drop \ STRUCT: ] if ;
: struct>assoc ( struct -- assoc )
[ class struct-slots ] [ struct-slot-values ] bi zip filter-tuple-assoc ;
: pprint-struct-slot ( slot -- )
<flow \ { pprint-word
{
[ name>> text ]
[ c-type>> dup string? [ text ] [ pprint* ] if ]
[ read-only>> [ \ read-only pprint-word ] when ]
[ initial>> [ \ initial: pprint-word pprint* ] when* ]
} cleave
\ } pprint-word block> ;
2009-08-30 21:46:31 -04:00
: pprint-struct ( struct -- )
[ [ \ S{ ] dip [ class ] [ struct>assoc ] bi \ } (pprint-tuple) ] ?pprint-tuple ;
: pprint-struct-pointer ( struct -- )
<block
2009-08-30 21:46:31 -04:00
\ S@ pprint-word
[ class pprint-word ]
[ >c-ptr pprint* ] bi
block> ;
2009-08-30 21:46:31 -04:00
PRIVATE>
M: struct-class see-class*
<colon dup struct-definer-word pprint-word dup pprint-word
<block struct-slots [ pprint-struct-slot ] each
block> pprint-; block> ;
2009-08-12 15:59:33 -04:00
M: struct pprint-delims
drop \ S{ \ } ;
M: struct >pprint-sequence
[ class ] [ struct-slot-values ] bi class-slot-sequence ;
M: struct pprint*
2009-08-30 21:46:31 -04:00
[ pprint-struct ]
[ pprint-struct-pointer ] pprint-c-object ;