| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2008-06-28 03:36:20 -04:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2008-04-14 03:20:37 -04:00
										 |  |  | quotations mirrors splitting math.parser classes vocabs refs | 
					
						
							| 
									
										
										
										
											2008-07-02 01:20:01 -04:00
										 |  |  | sets sorting summary debugger continuations ;
 | 
					
						
							| 
									
										
										
										
											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 -- )
 | 
					
						
							|  |  |  |     rot summary. | 
					
						
							|  |  |  |     dup empty? [ | 
					
						
							|  |  |  |         2drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dup enum? [ +sequence+ on ] when
 | 
					
						
							|  |  |  |         standard-table-style [ | 
					
						
							|  |  |  |             swap [ -rot describe-row ] curry each-index
 | 
					
						
							|  |  |  |         ] tabular-output | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							| 
									
										
										
										
											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 -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  |     [ [ global eq? not ] filter [ keys ] gather ] keep
 | 
					
						
							|  |  |  |     [ dupd assoc-stack ] curry 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 ;
 |