1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays fry hashtables io kernel macros make
4 math.parser multiline namespaces present sequences
5 sequences.generalizations splitting strings vocabs.parser ;
10 TUPLE: interpolate-var name ;
12 : (parse-interpolate) ( string -- )
14 "${" split1-slice [ >string , ] [
17 [ >string interpolate-var boa , ]
18 [ (parse-interpolate) ] bi*
23 : parse-interpolate ( string -- seq )
24 [ (parse-interpolate) ] { } make ;
26 : (interpolate) ( string quot -- quot' )
27 [ parse-interpolate ] dip '[
29 [ name>> @ '[ _ @ present write ] ]
32 ] map [ ] join ; inline
36 MACRO: interpolate ( string -- )
37 [ [ get ] ] (interpolate) ;
39 : interpolate-locals ( string -- quot )
40 [ search [ ] ] (interpolate) ;
43 "]I" parse-multiline-string
44 interpolate-locals append! ;
46 MACRO: ninterpolate ( str n -- quot )
48 _ narray [ number>string swap 2array ] map-index
49 >hashtable [ _ interpolate ] with-variables