2009-01-26 00:04:19 -05:00
|
|
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
2008-10-01 19:15:41 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2015-04-18 20:18:37 -04:00
|
|
|
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 ;
|
2008-10-01 19:15:41 -04:00
|
|
|
IN: interpolate
|
|
|
|
|
2009-01-26 00:04:19 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
TUPLE: named-var name ;
|
2008-12-04 03:26:34 -05:00
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
TUPLE: stack-var n ;
|
|
|
|
|
|
|
|
: (parse-interpolate) ( str -- )
|
2008-12-04 03:26:34 -05:00
|
|
|
[
|
2015-04-18 20:18:37 -04:00
|
|
|
"${" split1-slice [
|
|
|
|
[ >string , ] unless-empty
|
|
|
|
] [
|
2008-12-04 03:26:34 -05:00
|
|
|
[
|
|
|
|
"}" split1-slice
|
2015-04-18 20:18:37 -04:00
|
|
|
[
|
|
|
|
>string dup string>number
|
|
|
|
[ stack-var boa ] [ named-var boa ] ?if ,
|
|
|
|
]
|
2008-12-04 03:26:34 -05:00
|
|
|
[ (parse-interpolate) ] bi*
|
|
|
|
] when*
|
|
|
|
] bi*
|
|
|
|
] unless-empty ;
|
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
: parse-interpolate ( str -- seq )
|
2008-12-04 03:26:34 -05:00
|
|
|
[ (parse-interpolate) ] { } make ;
|
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
: max-stack-var ( seq -- n/f )
|
|
|
|
f [
|
|
|
|
dup stack-var? [ n>> [ or ] keep max ] [ drop ] if
|
|
|
|
] reduce ;
|
|
|
|
|
|
|
|
:: interpolate-quot ( str quot -- quot' )
|
|
|
|
str parse-interpolate :> args
|
|
|
|
args max-stack-var :> vars
|
|
|
|
|
|
|
|
args [
|
|
|
|
dup named-var? [
|
|
|
|
name>> quot call '[ _ @ present write ]
|
|
|
|
] [
|
|
|
|
dup stack-var? [
|
|
|
|
n>> vars swap - 1 + '[ _ npick present write ]
|
|
|
|
] [
|
|
|
|
'[ _ write ]
|
|
|
|
] if
|
|
|
|
] if
|
|
|
|
] map concat
|
|
|
|
|
|
|
|
vars [
|
|
|
|
1 + '[ _ ndrop ] append
|
|
|
|
] when* ; inline
|
2008-10-01 19:15:41 -04:00
|
|
|
|
2009-01-26 00:04:19 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
MACRO: interpolate. ( str -- )
|
|
|
|
[ [ get ] ] interpolate-quot ;
|
|
|
|
|
|
|
|
: interpolate ( str -- newstr )
|
|
|
|
[ interpolate. ] with-string-writer ; inline
|
2008-10-01 19:15:41 -04:00
|
|
|
|
2015-04-18 20:18:37 -04:00
|
|
|
: interpolate-locals ( str -- quot )
|
|
|
|
[ dup search [ [ ] ] [ [ get ] ] ?if ] interpolate-quot ;
|
2009-01-26 03:39:15 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: I[
|
2009-01-26 00:04:19 -05:00
|
|
|
"]I" parse-multiline-string
|
2009-10-28 16:29:01 -04:00
|
|
|
interpolate-locals append! ;
|