factor/library/tools/describe.factor

113 lines
2.8 KiB
Factor
Raw Normal View History

! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: inspector
USING: arrays generic hashtables help io kernel kernel-internals
lists math prettyprint sequences strings vectors words ;
2005-10-03 20:54:05 -04:00
GENERIC: summary ( object -- string )
: sign-string ( n -- string )
0 > "a positive " "a negative " ? ;
M: integer summary
2006-04-14 03:53:45 -04:00
dup zero? [
"a " "zero "
] [
dup sign-string over 2 mod zero? "even " "odd " ?
] if rot class word-name append3 ;
2005-10-03 20:54:05 -04:00
M: real summary
dup sign-string swap class word-name append ;
M: complex summary
"a complex number in the "
swap quadrant { "first" "second" "fourth" "third" } nth
2005-10-03 20:54:05 -04:00
" quadrant" append3 ;
GENERIC: sheet ( obj -- sheet )
2005-10-03 20:54:05 -04:00
M: object summary
"an instance of the " swap class word-name " class" append3 ;
2006-01-06 02:04:42 -05:00
: slot-sheet ( obj -- sheet )
dup class "slots" word-prop
2006-05-02 03:05:57 -04:00
dup [ third ] map -rot
[ first slot ] map-with
2array ;
2006-01-06 02:04:42 -05:00
M: object sheet ( obj -- sheet ) slot-sheet ;
2005-10-03 20:54:05 -04:00
M: sequence summary
dup length 1 = [
drop "a sequence containing 1 element"
2005-10-03 20:54:05 -04:00
] [
"a sequence containing " swap length number>string
2005-10-03 20:54:05 -04:00
" elements" append3
] if ;
M: list sheet 1array ;
M: vector sheet 1array ;
M: array sheet 1array ;
2005-10-03 20:54:05 -04:00
M: hashtable summary
"a hashtable storing " swap hash-size number>string
" keys" append3 ;
M: hashtable sheet hash>alist flip ;
2005-10-03 20:54:05 -04:00
M: word summary ( word -- )
dup word-vocabulary [
dup interned?
"a word in the " "a word orphaned from the " ?
swap word-vocabulary " vocabulary" append3
] [
drop "a uniquely generated symbol"
] if ;
2005-09-27 14:35:30 -04:00
: format-column ( list ? -- list )
2005-10-04 03:16:50 -04:00
>r [ unparse-short ] map r> [
2005-09-27 14:35:30 -04:00
[ 0 [ length max ] reduce ] keep
[ swap CHAR: \s pad-right ] map-with
] unless ;
: format-sheet ( sheet -- list )
2005-09-27 14:35:30 -04:00
#! We use an idiom to notify format-column if it is
#! formatting the last column.
2006-01-28 15:49:31 -05:00
dup length reverse-slice [ zero? format-column ] 2map
2005-09-27 14:35:30 -04:00
flip [ " " join ] map ;
2005-09-25 21:59:22 -04:00
DEFER: describe
: sheet. ( sheet -- )
dup empty? [
drop
] [
dup format-sheet swap peek
[ dup [ describe ] curry simple-outliner terpri ] 2each
] if ;
2005-10-03 20:54:05 -04:00
: describe ( object -- ) dup summary print sheet sheet. ;
2005-09-25 21:59:22 -04:00
: sequence-outliner ( seq quot -- | quot: obj -- )
2005-09-25 22:20:29 -04:00
swap [
[ unparse-short ] keep rot dupd curry
simple-outliner terpri
2005-09-25 22:20:29 -04:00
] each-with ;
2005-09-25 22:20:29 -04:00
: words. ( vocab -- )
2006-01-09 01:34:23 -05:00
words natural-sort [ (help) ] sequence-outliner ;
2005-09-25 22:20:29 -04:00
2006-03-25 01:06:52 -05:00
: vocabs. ( -- ) vocabs [ words. ] sequence-outliner ;
2006-03-25 01:06:52 -05:00
: usage. ( word -- ) usage [ usage. ] sequence-outliner ;
2005-09-25 22:20:29 -04:00
2006-03-25 01:06:52 -05:00
: uses. ( word -- ) uses [ uses. ] sequence-outliner ;
2005-09-25 22:20:29 -04:00
2006-03-25 01:06:52 -05:00
: stack. ( seq -- seq ) reverse-slice >array describe ;
2005-09-27 00:24:42 -04:00
: .s datastack stack. ;
2006-05-14 23:09:47 -04:00
: .r retainstack stack. ;
: .c callstack stack. ;