]> gitweb.factorcode.org Git - factor.git/commitdiff
add interpolate
authorDoug Coleman <doug.coleman@gmail.com>
Wed, 1 Oct 2008 23:15:41 +0000 (18:15 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Wed, 1 Oct 2008 23:15:41 +0000 (18:15 -0500)
basis/interpolate/authors.txt [new file with mode: 0644]
basis/interpolate/interpolate-tests.factor [new file with mode: 0644]
basis/interpolate/interpolate.factor [new file with mode: 0644]

diff --git a/basis/interpolate/authors.txt b/basis/interpolate/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/basis/interpolate/interpolate-tests.factor b/basis/interpolate/interpolate-tests.factor
new file mode 100644 (file)
index 0000000..005ae87
--- /dev/null
@@ -0,0 +1,4 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test interpolate ;
+IN: interpolate.tests
diff --git a/basis/interpolate/interpolate.factor b/basis/interpolate/interpolate.factor
new file mode 100644 (file)
index 0000000..27f0756
--- /dev/null
@@ -0,0 +1,21 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: io kernel macros make multiline namespaces parser
+peg.ebnf present sequences strings ;
+IN: interpolate
+
+MACRO: interpolate ( string -- )
+[EBNF
+var = "${" [^}]+ "}" => [[ second >string [ get present write ] curry ]]
+text = [^$]+ => [[ >string [ write ] curry ]]
+interpolate = (var|text)* => [[ [ ] join ]]
+EBNF] ;
+
+EBNF: interpolate-locals
+var = "${" [^}]+ "}" => [[ [ second >string search , [ present write ] % ] [ ] make ]]
+text = [^$]+ => [[ [ >string , [ write ] % ] [ ] make ]]
+interpolate = (var|text)* => [[ [ ] join ]]
+;EBNF
+
+: I[ "]I" parse-multiline-string
+    interpolate-locals parsed \ call parsed ; parsing