Clean up some duplication in interpolate

db4
Slava Pestov 2009-01-25 23:04:19 -06:00
parent 4d080b8785
commit 7360cd5b30
1 changed files with 16 additions and 13 deletions

View File

@ -1,9 +1,11 @@
! Copyright (C) 2008 Slava Pestov.
! Copyright (C) 2008, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: io kernel macros make multiline namespaces parser
present sequences strings splitting fry accessors ;
IN: interpolate
<PRIVATE
TUPLE: interpolate-var name ;
: (parse-interpolate) ( string -- )
@ -20,21 +22,22 @@ TUPLE: interpolate-var name ;
: parse-interpolate ( string -- seq )
[ (parse-interpolate) ] { } make ;
MACRO: interpolate ( string -- )
parse-interpolate [
: (interpolate) ( string quot -- quot' )
[ parse-interpolate ] dip '[
dup interpolate-var?
[ name>> '[ _ get present write ] ]
[ name>> @ '[ _ @ present write ] ]
[ '[ _ write ] ]
if
] map [ ] join ;
] map [ ] join ; inline
: interpolate-locals ( string -- quot )
parse-interpolate [
dup interpolate-var?
[ name>> search '[ _ present write ] ]
[ '[ _ write ] ]
if
] map [ ] join ;
[ search [ ] ] (interpolate) ;
: I[ "]I" parse-multiline-string
interpolate-locals parsed \ call parsed ; parsing
PRIVATE>
MACRO: interpolate ( string -- )
[ [ get ] ] (interpolate) ;
: I[
"]I" parse-multiline-string
interpolate-locals over push-all ; parsing