]> gitweb.factorcode.org Git - factor.git/blob - basis/interpolate/interpolate.factor
basis/extra: fix using for map-index move back to sequences.
[factor.git] / basis / interpolate / interpolate.factor
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 ;
6 IN: interpolate
7
8 <PRIVATE
9
10 TUPLE: interpolate-var name ;
11
12 : (parse-interpolate) ( string -- )
13     [
14         "${" split1-slice [ >string , ] [
15             [
16                 "}" split1-slice
17                 [ >string interpolate-var boa , ]
18                 [ (parse-interpolate) ] bi*
19             ] when*
20         ] bi*
21     ] unless-empty ;
22
23 : parse-interpolate ( string -- seq )
24     [ (parse-interpolate) ] { } make ;
25
26 : (interpolate) ( string quot -- quot' )
27     [ parse-interpolate ] dip '[
28         dup interpolate-var?
29         [ name>> @ '[ _ @ present write ] ]
30         [ '[ _ write ] ]
31         if
32     ] map [ ] join ; inline
33
34 PRIVATE>
35
36 MACRO: interpolate ( string -- )
37     [ [ get ] ] (interpolate) ;
38
39 : interpolate-locals ( string -- quot )
40     [ search [ ] ] (interpolate) ;
41
42 SYNTAX: I[
43     "]I" parse-multiline-string
44     interpolate-locals append! ;
45
46 MACRO: ninterpolate ( str n -- quot )
47     swap '[
48         _ narray [ number>string swap 2array ] map-index
49         >hashtable [ _ interpolate ] with-variables
50     ] ;