| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  | ! Copyright (C) 2008, 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-10-01 19:15:41 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-05-13 23:15:48 -04:00
										 |  |  | USING: io kernel macros make multiline namespaces vocabs.parser | 
					
						
							| 
									
										
										
										
											2008-12-04 03:26:34 -05:00
										 |  |  | present sequences strings splitting fry accessors ;
 | 
					
						
							| 
									
										
										
										
											2008-10-01 19:15:41 -04:00
										 |  |  | IN: interpolate | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-04 03:26:34 -05:00
										 |  |  | TUPLE: interpolate-var name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parse-interpolate) ( string -- )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         "${" split1-slice [ >string , ] [ | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 "}" split1-slice | 
					
						
							|  |  |  |                 [ >string interpolate-var boa , ] | 
					
						
							|  |  |  |                 [ (parse-interpolate) ] bi*
 | 
					
						
							|  |  |  |             ] when*
 | 
					
						
							|  |  |  |         ] bi*
 | 
					
						
							|  |  |  |     ] unless-empty ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-interpolate ( string -- seq )
 | 
					
						
							|  |  |  |     [ (parse-interpolate) ] { } make ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  | : (interpolate) ( string quot -- quot' )
 | 
					
						
							|  |  |  |     [ parse-interpolate ] dip '[ | 
					
						
							| 
									
										
										
										
											2008-12-04 03:26:34 -05:00
										 |  |  |         dup interpolate-var? | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  |         [ name>> @ '[ _ @ present write ] ] | 
					
						
							| 
									
										
										
										
											2008-12-04 03:26:34 -05:00
										 |  |  |         [ '[ _ write ] ] | 
					
						
							|  |  |  |         if
 | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  |     ] map [ ] join ; inline
 | 
					
						
							| 
									
										
										
										
											2008-10-01 19:15:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MACRO: interpolate ( string -- )
 | 
					
						
							|  |  |  |     [ [ get ] ] (interpolate) ;
 | 
					
						
							| 
									
										
										
										
											2008-10-01 19:15:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-26 03:39:15 -05:00
										 |  |  | : interpolate-locals ( string -- quot )
 | 
					
						
							|  |  |  |     [ search [ ] ] (interpolate) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-21 02:27:50 -04:00
										 |  |  | SYNTAX: I[ | 
					
						
							| 
									
										
										
										
											2009-01-26 00:04:19 -05:00
										 |  |  |     "]I" parse-multiline-string | 
					
						
							| 
									
										
										
										
											2009-03-21 02:27:50 -04:00
										 |  |  |     interpolate-locals over push-all ;
 |