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 ;
|