1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors fry generalizations io io.streams.string kernel
4 make math math.order math.parser multiline namespaces present
5 sequences splitting strings strings.parser vocabs.parser ;
10 TUPLE: named-var name ;
16 : (parse-interpolate) ( str -- )
19 [ >string , ] unless-empty
27 [ [ anon-var new ] [ named-var boa ] if-empty ] ?if ,
29 [ (parse-interpolate) ] bi*
34 : deanonymize ( seq -- seq' )
37 drop 1 + dup stack-var boa
41 : parse-interpolate ( str -- seq )
42 [ (parse-interpolate) ] { } make deanonymize ;
44 : max-stack-var ( seq -- n/f )
46 dup stack-var? [ n>> [ or ] keep max ] [ drop ] if
49 :: (interpolate-quot) ( str quot -- quot' )
50 str parse-interpolate :> args
51 args max-stack-var :> vars
55 name>> quot call '[ _ @ present write ]
58 n>> '[ _ npick present write ]
71 : interpolate-quot ( str -- quot )
72 [ [ get ] ] (interpolate-quot) ;
74 MACRO: interpolate ( str -- quot )
77 : interpolate>string ( str -- newstr )
78 [ interpolate ] with-string-writer ; inline
80 : interpolate-locals-quot ( str -- quot )
81 [ [ search ] [ [ ] ] [ [ get ] ] ?if ] (interpolate-quot) ;
83 MACRO: interpolate-locals ( str -- quot )
84 interpolate-locals-quot ;
86 : interpolate-locals>string ( str -- newstr )
87 [ interpolate-locals ] with-string-writer ; inline
90 "I]" parse-multiline-string
91 interpolate-locals-quot append! ;
93 SYNTAX: I" parse-string '[ _ interpolate>string ] append! ;