]> gitweb.factorcode.org Git - factor.git/blob - basis/interpolate/interpolate.factor
Rewrite interpolate without using PEGs for mad lulz
[factor.git] / basis / interpolate / interpolate.factor
1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: io kernel macros make multiline namespaces parser
4 present sequences strings splitting fry accessors ;
5 IN: interpolate
6
7 TUPLE: interpolate-var name ;
8
9 : (parse-interpolate) ( string -- )
10     [
11         "${" split1-slice [ >string , ] [
12             [
13                 "}" split1-slice
14                 [ >string interpolate-var boa , ]
15                 [ (parse-interpolate) ] bi*
16             ] when*
17         ] bi*
18     ] unless-empty ;
19
20 : parse-interpolate ( string -- seq )
21     [ (parse-interpolate) ] { } make ;
22
23 MACRO: interpolate ( string -- )
24     parse-interpolate [
25         dup interpolate-var?
26         [ name>> '[ _ get present write ] ]
27         [ '[ _ write ] ]
28         if
29     ] map [ ] join ;
30
31 : interpolate-locals ( string -- quot )
32     parse-interpolate [
33         dup interpolate-var?
34         [ name>> search '[ _ present write ] ]
35         [ '[ _ write ] ]
36         if
37     ] map [ ] join ;
38
39 : I[ "]I" parse-multiline-string
40     interpolate-locals parsed \ call parsed ; parsing