factor/basis/inspector/inspector.factor

137 lines
3.4 KiB
Factor
Raw Normal View History

2008-02-21 02:26:44 -05:00
! Copyright (C) 2005, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays generic hashtables io kernel assocs math
2007-09-20 18:09:08 -04:00
namespaces prettyprint sequences strings io.styles vectors words
quotations mirrors splitting math.parser classes vocabs refs
2008-12-22 06:41:01 -05:00
sets sorting summary debugger continuations fry ;
2007-09-20 18:09:08 -04:00
IN: inspector
: value-editor ( path -- )
[
[ pprint-short ] presented-printer set
dup presented-path set
] H{ } make-assoc
[ get-ref pprint-short ] with-nesting ;
SYMBOL: +sequence+
SYMBOL: +number-rows+
SYMBOL: +editable+
: write-slot-editor ( path -- )
[
+editable+ get [
value-editor
] [
get-ref pprint-short
] if
] with-cell ;
: write-key ( mirror key -- )
+sequence+ get
[ 2drop ] [ <key-ref> write-slot-editor ] if ;
: write-value ( mirror key -- )
<value-ref> write-slot-editor ;
2008-07-14 00:26:34 -04:00
: describe-row ( mirror key n -- )
2007-09-20 18:09:08 -04:00
[
+number-rows+ get [ pprint-cell ] [ drop ] if
2008-07-14 00:26:34 -04:00
[ write-key ] [ write-value ] 2bi
2007-09-20 18:09:08 -04:00
] with-row ;
: summary. ( obj -- ) [ summary ] keep write-object nl ;
2008-06-27 01:48:05 -04:00
: sorted-keys ( assoc -- alist )
2008-06-29 22:37:57 -04:00
dup hashtable? [
2008-06-27 01:48:05 -04:00
keys
[ [ unparse-short ] keep ] { } map>assoc
sort-keys values
2008-06-29 22:37:57 -04:00
] [ keys ] if ;
2008-06-27 01:48:05 -04:00
2008-07-14 00:26:34 -04:00
: describe* ( obj mirror keys -- )
[ summary. ] 2dip
[ drop ] [
2008-07-14 00:26:34 -04:00
dup enum? [ +sequence+ on ] when
standard-table-style [
2008-12-22 06:41:01 -05:00
swap '[ [ _ ] 2dip describe-row ] each-index
2008-07-14 00:26:34 -04:00
] tabular-output
2008-09-06 20:13:59 -04:00
] if-empty ;
2007-09-20 18:09:08 -04:00
2008-07-14 00:26:34 -04:00
: describe ( obj -- )
dup make-mirror dup sorted-keys describe* ;
2007-09-20 18:09:08 -04:00
2008-07-02 01:20:01 -04:00
M: tuple error. describe ;
2008-02-21 02:26:44 -05:00
: namestack. ( seq -- )
[ [ global eq? not ] filter [ keys ] gather ] keep
2008-12-22 06:41:01 -05:00
'[ dup _ assoc-stack ] H{ } map>assoc describe ;
2008-02-21 02:26:44 -05:00
: .vars ( -- )
namestack namestack. ;
2008-07-02 01:20:01 -04:00
: :vars ( -- )
2008-08-29 17:54:28 -04:00
error-continuation get name>> namestack. ;
2008-07-02 01:20:01 -04:00
2007-09-20 18:09:08 -04:00
SYMBOL: inspector-hook
2008-07-14 00:26:34 -04:00
[ t +number-rows+ [ describe* ] with-variable ] inspector-hook set-global
2007-09-20 18:09:08 -04:00
SYMBOL: inspector-stack
SYMBOL: me
: reinspect ( obj -- )
2008-07-14 00:26:34 -04:00
[ me set ]
[
dup make-mirror dup mirror set dup sorted-keys dup \ keys set
inspector-hook get call
] bi ;
2007-09-20 18:09:08 -04:00
: (inspect) ( obj -- )
2008-07-14 00:26:34 -04:00
[ inspector-stack get push ] [ reinspect ] bi ;
2007-09-20 18:09:08 -04:00
: key@ ( n -- key ) \ keys get nth ;
: &push ( -- obj ) me get ;
: &at ( n -- ) key@ mirror get at (inspect) ;
: &back ( -- )
inspector-stack get
dup length 1 <= [ drop ] [ dup pop* peek reinspect ] if ;
: &add ( value key -- ) mirror get set-at &push reinspect ;
: &put ( value n -- ) key@ &add ;
: &delete ( n -- ) key@ mirror get delete-at &push reinspect ;
: &rename ( key n -- ) key@ mirror get rename-at &push reinspect ;
: &help ( -- )
#! A tribute to Slate:
"You are in a twisty little maze of objects, all alike." print
nl
"'n' is a slot number in the following:" print
nl
"&back -- return to previous object" print
"&push ( -- obj ) push this object" print
"&at ( n -- ) inspect nth slot" print
"&put ( value n -- ) change nth slot" print
"&add ( value key -- ) add new slot" print
"&delete ( n -- ) remove a slot" print
"&rename ( key n -- ) change a slot's key" print
2008-07-14 00:26:34 -04:00
"&globals ( -- ) inspect global namespace" print
2007-09-20 18:09:08 -04:00
"&help -- display this message" print
nl ;
: inspector ( obj -- )
&help
V{ } clone inspector-stack set
(inspect) ;
: inspect ( obj -- )
inspector-stack get [ (inspect) ] [ inspector ] if ;
2008-07-14 00:26:34 -04:00
: &globals ( -- ) global inspect ;