| 
									
										
										
										
											2010-01-14 10:10:13 -05:00
										 |  |  | ! Copyright (C) 2005, 2010 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 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | namespaces prettyprint prettyprint.custom prettyprint.sections | 
					
						
							|  |  |  | sequences strings io.styles vectors words quotations mirrors | 
					
						
							|  |  |  | splitting math.parser classes vocabs sets sorting summary | 
					
						
							|  |  |  | debugger continuations fry combinators ;
 | 
					
						
							| 
									
										
										
										
											2010-02-26 16:01:01 -05:00
										 |  |  | FROM: namespaces => set ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: inspector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: +number-rows+ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-22 17:37:15 -04:00
										 |  |  | : print-summary ( obj -- )
 | 
					
						
							|  |  |  |     [ safe-summary ] keep write-object ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | : sort-unparsed-keys ( assoc -- alist )
 | 
					
						
							|  |  |  |     >alist dup keys
 | 
					
						
							|  |  |  |     [ unparse-short ] map
 | 
					
						
							|  |  |  |     zip sort-values keys ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | GENERIC: add-numbers ( alist -- table' )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | M: enum add-numbers ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: assoc add-numbers | 
					
						
							| 
									
										
										
										
											2010-01-14 10:10:13 -05:00
										 |  |  |     +number-rows+ get [ [ prefix ] map-index ] when ;
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | TUPLE: slot-name name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: slot-name pprint* name>> text ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | GENERIC: fix-slot-names ( assoc -- assoc )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: assoc fix-slot-names >alist ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: mirror fix-slot-names | 
					
						
							|  |  |  |     [ [ slot-name boa ] dip ] { } assoc-map-as ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (describe) ( obj assoc -- keys )
 | 
					
						
							| 
									
										
										
										
											2009-01-18 20:33:28 -05:00
										 |  |  |     t pprint-string-cells? [ | 
					
						
							| 
									
										
										
										
											2009-03-11 04:17:30 -04:00
										 |  |  |         [ print-summary nl ] [ | 
					
						
							| 
									
										
										
										
											2009-01-18 20:33:28 -05:00
										 |  |  |             dup hashtable? [ sort-unparsed-keys ] when
 | 
					
						
							|  |  |  |             [ fix-slot-names add-numbers simple-table. ] [ keys ] bi
 | 
					
						
							|  |  |  |         ] bi*
 | 
					
						
							|  |  |  |     ] with-variable ;
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : describe ( obj -- ) dup make-mirror (describe) drop ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 01:20:01 -04:00
										 |  |  | M: tuple error. describe ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-05 05:00:27 -05:00
										 |  |  | : vars-in-scope ( seq -- alist )
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  |     [ [ global eq? not ] filter [ keys ] gather ] keep
 | 
					
						
							| 
									
										
										
										
											2009-02-05 05:00:27 -05:00
										 |  |  |     '[ dup _ assoc-stack ] H{ } map>assoc ;
 | 
					
						
							| 
									
										
										
										
											2008-02-21 02:26:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : .vars ( -- )
 | 
					
						
							| 
									
										
										
										
											2009-02-05 05:00:27 -05:00
										 |  |  |     namestack vars-in-scope describe ;
 | 
					
						
							| 
									
										
										
										
											2008-02-21 02:26:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-02 01:20:01 -04:00
										 |  |  | : :vars ( -- )
 | 
					
						
							| 
									
										
										
										
											2009-02-05 05:00:27 -05:00
										 |  |  |     error-continuation get name>> vars-in-scope describe ;
 | 
					
						
							| 
									
										
										
										
											2008-07-02 01:20:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | SYMBOL: me | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: inspector-stack | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | SYMBOL: sorted-keys | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : reinspect ( obj -- )
 | 
					
						
							| 
									
										
										
										
											2008-07-14 00:26:34 -04:00
										 |  |  |     [ me set ] | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  |         dup make-mirror dup mirror set
 | 
					
						
							|  |  |  |         t +number-rows+ [ (describe) ] with-variable
 | 
					
						
							|  |  |  |         sorted-keys set
 | 
					
						
							| 
									
										
										
										
											2008-07-14 00:26:34 -04:00
										 |  |  |     ] 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-08 18:02:54 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : key@ ( n -- key ) sorted-keys get nth ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : &push ( -- obj ) me get ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : &at ( n -- ) key@ mirror get at (inspect) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : &back ( -- )
 | 
					
						
							|  |  |  |     inspector-stack get
 | 
					
						
							| 
									
										
										
										
											2009-05-25 17:38:33 -04:00
										 |  |  |     dup length 1 <= [ drop ] [ [ pop* ] [ last reinspect ] bi ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : &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 ;
 |