1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors fry generalizations io io.streams.string kernel
4 locals macros make math math.order math.parser multiline
5 namespaces present sequences splitting strings vocabs.parser ;
10 TUPLE: named-var name ;
14 : (parse-interpolate) ( str -- )
17 [ >string , ] unless-empty
22 >string dup string>number
23 [ stack-var boa ] [ named-var boa ] ?if ,
25 [ (parse-interpolate) ] bi*
30 : parse-interpolate ( str -- seq )
31 [ (parse-interpolate) ] { } make ;
33 : max-stack-var ( seq -- n/f )
35 dup stack-var? [ n>> [ or ] keep max ] [ drop ] if
38 :: interpolate-quot ( str quot -- quot' )
39 str parse-interpolate :> args
40 args max-stack-var :> vars
44 name>> quot call '[ _ @ present write ]
47 n>> 1 + '[ _ npick present write ]
55 1 + '[ _ ndrop ] append
60 MACRO: interpolate ( str -- )
61 [ [ get ] ] interpolate-quot ;
63 : interpolate>string ( str -- newstr )
64 [ interpolate ] with-string-writer ; inline
66 : interpolate-locals ( str -- quot )
67 [ dup search [ [ ] ] [ [ get ] ] ?if ] interpolate-quot ;
70 "]I" parse-multiline-string
71 interpolate-locals append! ;