! Copyright (C) 2008, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors fry generalizations io io.streams.string kernel
-locals macros make math math.order math.parser multiline
-namespaces present sequences splitting strings vocabs.parser ;
+make math math.order math.parser multiline namespaces present
+sequences splitting strings vocabs.parser ;
IN: interpolate
<PRIVATE
TUPLE: stack-var n ;
+TUPLE: anon-var ;
+
: (parse-interpolate) ( str -- )
[
"${" split1-slice [
"}" split1-slice
[
>string dup string>number
- [ stack-var boa ] [ named-var boa ] ?if ,
+ [ 1 + stack-var boa ]
+ [ [ anon-var new ] [ named-var boa ] if-empty ] ?if ,
]
[ (parse-interpolate) ] bi*
] when*
] bi*
] unless-empty ;
+: deanonymize ( seq -- seq' )
+ 0 over <reversed> [
+ dup anon-var? [
+ drop 1 + dup stack-var boa
+ ] when
+ ] map! 2drop ;
+
: parse-interpolate ( str -- seq )
- [ (parse-interpolate) ] { } make ;
+ [ (parse-interpolate) ] { } make deanonymize ;
: max-stack-var ( seq -- n/f )
f [
dup stack-var? [ n>> [ or ] keep max ] [ drop ] if
] reduce ;
-:: interpolate-quot ( str quot -- quot' )
+:: (interpolate-quot) ( str quot -- quot' )
str parse-interpolate :> args
args max-stack-var :> vars
name>> quot call '[ _ @ present write ]
] [
dup stack-var? [
- n>> vars swap - 1 + '[ _ npick present write ]
+ n>> '[ _ npick present write ]
] [
'[ _ write ]
] if
] map concat
vars [
- 1 + '[ _ ndrop ] append
+ '[ _ ndrop ] append
] when* ; inline
PRIVATE>
-MACRO: interpolate ( str -- )
- [ [ get ] ] interpolate-quot ;
+: interpolate-quot ( str -- quot )
+ [ [ get ] ] (interpolate-quot) ;
+
+MACRO: interpolate ( str -- quot )
+ interpolate-quot ;
: interpolate>string ( str -- newstr )
[ interpolate ] with-string-writer ; inline
-: interpolate-locals ( str -- quot )
- [ dup search [ [ ] ] [ [ get ] ] ?if ] interpolate-quot ;
+: interpolate-locals-quot ( str -- quot )
+ [ dup search [ [ ] ] [ [ get ] ] ?if ] (interpolate-quot) ;
+
+MACRO: interpolate-locals ( str -- quot )
+ interpolate-locals-quot ;
+
+: interpolate-locals>string ( str -- newstr )
+ [ interpolate-locals ] with-string-writer ; inline
-SYNTAX: I[
- "]I" parse-multiline-string
- interpolate-locals append! ;
+SYNTAX: [I
+ "I]" parse-multiline-string
+ interpolate-locals-quot append! ;