| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | ! Copyright (C) 2007, 2010 Daniel Ehrenberg, Bruno Deferrari, | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | ! Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: assocs hashtables kernel namespaces sequences | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | sets strings vocabs sorting accessors arrays compiler.units | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | combinators vectors splitting continuations math words | 
					
						
							| 
									
										
										
										
											2009-05-16 10:40:17 -04:00
										 |  |  | parser.notes ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | IN: vocabs.parser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: no-word-error name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  | : word-restarts ( possibilities -- restarts )
 | 
					
						
							|  |  |  |     natural-sort | 
					
						
							|  |  |  |     [ [ vocabulary>> "Use the " " vocabulary" surround ] keep ] { } map>assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : word-restarts-with-defer ( name possibilities -- restarts )
 | 
					
						
							|  |  |  |     word-restarts | 
					
						
							|  |  |  |     swap "Defer word in current vocabulary" swap 2array
 | 
					
						
							|  |  |  |     suffix ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <no-word-error> ( name possibilities -- error restarts )
 | 
					
						
							|  |  |  |     [ drop \ no-word-error boa ] [ word-restarts-with-defer ] 2bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | TUPLE: manifest | 
					
						
							|  |  |  | current-vocab | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  | { search-vocab-names hashtable } | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | { search-vocabs vector } | 
					
						
							|  |  |  | { qualified-vocabs vector } | 
					
						
							| 
									
										
										
										
											2009-05-16 05:26:45 -04:00
										 |  |  | { auto-used vector } ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : <manifest> ( -- manifest )
 | 
					
						
							|  |  |  |     manifest new
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         H{ } clone >>search-vocab-names | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |         V{ } clone >>search-vocabs | 
					
						
							|  |  |  |         V{ } clone >>qualified-vocabs | 
					
						
							| 
									
										
										
										
											2009-05-16 05:26:45 -04:00
										 |  |  |         V{ } clone >>auto-used ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | M: manifest clone | 
					
						
							|  |  |  |     call-next-method | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         [ clone ] change-search-vocab-names | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |         [ clone ] change-search-vocabs | 
					
						
							|  |  |  |         [ clone ] change-qualified-vocabs | 
					
						
							| 
									
										
										
										
											2009-05-16 05:26:45 -04:00
										 |  |  |         [ clone ] change-auto-used ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 03:32:55 -04:00
										 |  |  | TUPLE: extra-words words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 05:26:45 -04:00
										 |  |  | M: extra-words equal? | 
					
						
							|  |  |  |     over extra-words? [ [ words>> ] bi@ eq? ] [ 2drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 03:32:55 -04:00
										 |  |  | C: <extra-words> extra-words | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : clear-manifest ( -- )
 | 
					
						
							|  |  |  |     manifest get
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |     [ search-vocab-names>> clear-assoc ] | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     [ search-vocabs>> delete-all ] | 
					
						
							|  |  |  |     [ qualified-vocabs>> delete-all ] | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-18 07:51:29 -04:00
										 |  |  | ERROR: no-word-in-vocab word vocab ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-07 22:59:13 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : (add-qualified) ( qualified -- )
 | 
					
						
							|  |  |  |     manifest get qualified-vocabs>> push ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-18 07:51:29 -04:00
										 |  |  | : (from) ( vocab words -- vocab words words' vocab )
 | 
					
						
							|  |  |  |     2dup swap load-vocab ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | : extract-words ( seq vocab -- assoc )
 | 
					
						
							| 
									
										
										
										
											2009-07-18 07:51:29 -04:00
										 |  |  |     [ words>> extract-keys dup ] [ name>> ] bi
 | 
					
						
							|  |  |  |     [ swap [ 2drop ] [ no-word-in-vocab ] if ] curry assoc-each ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | : excluding-words ( seq vocab -- assoc )
 | 
					
						
							|  |  |  |     [ nip words>> ] [ extract-words ] 2bi assoc-diff ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : qualified-words ( prefix vocab -- assoc )
 | 
					
						
							|  |  |  |     words>> swap [ swap [ swap ":" glue ] dip ] curry assoc-map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : (lookup) ( name assoc -- word/f )
 | 
					
						
							|  |  |  |     at dup forward-reference? [ drop f ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 01:29:21 -04:00
										 |  |  | : (use-words) ( assoc -- extra-words seq )
 | 
					
						
							|  |  |  |     <extra-words> manifest get qualified-vocabs>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-current-vocab ( name -- )
 | 
					
						
							| 
									
										
										
										
											2009-05-16 01:29:21 -04:00
										 |  |  |     create-vocab | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     [ manifest get current-vocab<< ] [ (add-qualified) ] bi ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-09 23:33:34 -04:00
										 |  |  | : with-current-vocab ( name quot -- )
 | 
					
						
							|  |  |  |     manifest get clone manifest [ | 
					
						
							|  |  |  |         [ set-current-vocab ] dip call
 | 
					
						
							|  |  |  |     ] with-variable ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | TUPLE: no-current-vocab ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : no-current-vocab ( -- vocab )
 | 
					
						
							|  |  |  |     \ no-current-vocab boa
 | 
					
						
							|  |  |  |     { { "Define words in scratchpad vocabulary" "scratchpad" } } | 
					
						
							|  |  |  |     throw-restarts dup set-current-vocab ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : current-vocab ( -- vocab )
 | 
					
						
							|  |  |  |     manifest get current-vocab>> [ no-current-vocab ] unless* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : begin-private ( -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     current-vocab name>> ".private" ?tail | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     [ drop ] [ ".private" append set-current-vocab ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : end-private ( -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     current-vocab name>> ".private" ?tail | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     [ set-current-vocab ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  | : using-vocab? ( vocab -- ? )
 | 
					
						
							|  |  |  |     vocab-name manifest get search-vocab-names>> key? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : use-vocab ( vocab -- )
 | 
					
						
							|  |  |  |     dup using-vocab? | 
					
						
							| 
									
										
										
										
											2009-05-16 10:40:17 -04:00
										 |  |  |     [ vocab-name "Already using ``" "'' vocabulary" surround note. ] [ | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         manifest get
 | 
					
						
							|  |  |  |         [ [ load-vocab ] dip search-vocabs>> push ] | 
					
						
							| 
									
										
										
										
											2009-05-22 02:59:50 -04:00
										 |  |  |         [ [ vocab-name ] dip search-vocab-names>> conjoin ] | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         2bi
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 05:26:45 -04:00
										 |  |  | : auto-use-vocab ( vocab -- )
 | 
					
						
							|  |  |  |     [ use-vocab ] [ manifest get auto-used>> push ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : auto-used? ( -- ? ) manifest get auto-used>> length 0 > ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  | : unuse-vocab ( vocab -- )
 | 
					
						
							|  |  |  |     dup using-vocab? [ | 
					
						
							|  |  |  |         manifest get
 | 
					
						
							| 
									
										
										
										
											2009-10-28 01:23:08 -04:00
										 |  |  |         [ [ load-vocab ] dip search-vocabs>> remove-eq! drop ] | 
					
						
							| 
									
										
										
										
											2009-05-22 02:59:50 -04:00
										 |  |  |         [ [ vocab-name ] dip search-vocab-names>> delete-at ] | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         2bi
 | 
					
						
							|  |  |  |     ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | TUPLE: qualified vocab prefix words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <qualified> ( vocab prefix -- qualified )
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     (from) qualified-words qualified boa ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : add-qualified ( vocab prefix -- )
 | 
					
						
							|  |  |  |     <qualified> (add-qualified) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: from vocab names words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <from> ( vocab words -- from )
 | 
					
						
							|  |  |  |     (from) extract-words from boa ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : add-words-from ( vocab words -- )
 | 
					
						
							|  |  |  |     <from> (add-qualified) ;
 | 
					
						
							| 
									
										
										
										
											2009-05-13 23:15:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | TUPLE: exclude vocab names words ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : <exclude> ( vocab words -- from )
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     (from) excluding-words exclude boa ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : add-words-excluding ( vocab words -- )
 | 
					
						
							|  |  |  |     <exclude> (add-qualified) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: rename word vocab words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <rename> ( word vocab new-name -- rename )
 | 
					
						
							| 
									
										
										
										
											2009-07-18 07:51:29 -04:00
										 |  |  |     [ 2dup load-vocab words>> dupd at [ ] [ swap no-word-in-vocab ] ?if ] dip
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     associate rename boa ;
 | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : add-renamed-word ( word vocab new-name -- )
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     <rename> (add-qualified) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 01:29:21 -04:00
										 |  |  | : use-words ( assoc -- ) (use-words) push ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-28 00:25:35 -04:00
										 |  |  | : unuse-words ( assoc -- ) (use-words) remove! drop ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  | TUPLE: ambiguous-use-error words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <ambiguous-use-error> ( words -- error restarts )
 | 
					
						
							|  |  |  |     [ \ ambiguous-use-error boa ] [ word-restarts ] bi ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (vocab-search) ( name assocs -- words n )
 | 
					
						
							|  |  |  |     [ words>> (lookup) ] with map
 | 
					
						
							|  |  |  |     sift dup length ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : vocab-search ( name manifest -- word/f )
 | 
					
						
							|  |  |  |     search-vocabs>> | 
					
						
							|  |  |  |     (vocab-search) { | 
					
						
							|  |  |  |         { 0 [ drop f ] } | 
					
						
							|  |  |  |         { 1 [ first ] } | 
					
						
							| 
									
										
										
										
											2009-05-16 10:34:42 -04:00
										 |  |  |         [ | 
					
						
							|  |  |  |             drop <ambiguous-use-error> throw-restarts
 | 
					
						
							|  |  |  |             dup [ vocabulary>> ] [ name>> 1array ] bi add-words-from | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : qualified-search ( name manifest -- word/f )
 | 
					
						
							|  |  |  |     qualified-vocabs>> | 
					
						
							| 
									
										
										
										
											2009-05-25 17:38:33 -04:00
										 |  |  |     (vocab-search) 0 = [ drop f ] [ last ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : search-manifest ( name manifest -- word/f )
 | 
					
						
							| 
									
										
										
										
											2009-05-16 01:29:21 -04:00
										 |  |  |     2dup qualified-search dup [ 2nip ] [ drop vocab-search ] if ;
 | 
					
						
							| 
									
										
										
										
											2009-05-13 23:15:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-14 23:31:29 -04:00
										 |  |  | : search ( name -- word/f )
 | 
					
						
							|  |  |  |     manifest get search-manifest ;
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: update ( search-path-elt -- valid? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : trim-forgotten ( qualified-vocab -- valid? )
 | 
					
						
							|  |  |  |     [ [ nip "forgotten" word-prop not ] assoc-filter ] change-words | 
					
						
							|  |  |  |     words>> assoc-empty? not ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: from update trim-forgotten ;
 | 
					
						
							|  |  |  | M: rename update trim-forgotten ;
 | 
					
						
							|  |  |  | M: extra-words update trim-forgotten ;
 | 
					
						
							|  |  |  | M: exclude update trim-forgotten ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: qualified update | 
					
						
							| 
									
										
										
										
											2011-10-24 06:37:47 -04:00
										 |  |  |     dup vocab>> lookup-vocab [ | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |         dup [ prefix>> ] [ vocab>> load-vocab ] bi qualified-words | 
					
						
							|  |  |  |         >>words | 
					
						
							|  |  |  |     ] [ drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-24 06:37:47 -04:00
										 |  |  | M: vocab update dup name>> lookup-vocab eq? ;
 | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : update-manifest ( manifest -- )
 | 
					
						
							| 
									
										
										
										
											2011-10-24 06:37:47 -04:00
										 |  |  |     [ dup [ name>> lookup-vocab ] when ] change-current-vocab | 
					
						
							|  |  |  |     [ [ drop lookup-vocab ] assoc-filter ] change-search-vocab-names | 
					
						
							|  |  |  |     dup search-vocab-names>> keys [ lookup-vocab ] V{ } map-as >>search-vocabs | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     qualified-vocabs>> [ update ] filter! drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: manifest definitions-changed ( assoc manifest -- )
 | 
					
						
							|  |  |  |     nip update-manifest ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : with-manifest ( quot -- )
 | 
					
						
							|  |  |  |     <manifest> manifest [ | 
					
						
							| 
									
										
										
										
											2010-01-27 05:20:17 -05:00
										 |  |  |         [ call ] [ | 
					
						
							|  |  |  |             [ manifest get add-definition-observer call ] | 
					
						
							|  |  |  |             [ manifest get remove-definition-observer ] | 
					
						
							|  |  |  |             [ ] | 
					
						
							|  |  |  |             cleanup
 | 
					
						
							|  |  |  |         ] if-bootstrapping | 
					
						
							| 
									
										
										
										
											2010-01-27 02:26:40 -05:00
										 |  |  |     ] with-variable ; inline
 |