XML interpolation syntax
Syntax extensions for XML ยป XML literals


XML interpolation has two forms for each of the words <XML and [XML: a fry-like form and a locals form. To splice locals in, use the syntax <-variable->. To splice something in from the stack, in the style of fry, use the syntax <->. An XML interpolation form may only use one of these styles.

These forms can be used where a tag might go, as in [XML <foo><-></foo> XML] or where an attribute might go, as in [XML <foo bar=<->/> XML]. When an attribute is spliced in, it is not included if the value is f and if the value is not a string, the value is put through present. Here is an example of the fry style of XML interpolation:
USING: splitting xml.writer xml.syntax ; "one two three" " " split [ [XML <item><-></item> XML] ] map <XML <doc><-></doc> XML> pprint-xml
<?xml version="1.0" encoding="UTF-8"?> <doc> <item> one </item> <item> two </item> <item> three </item> </doc>

Here is an example of the locals version:
USING: locals urls xml.syntax xml.writer ; [let 3 :> number f :> false URL" https://factorcode.org/" :> url "hello" :> string \ drop :> word <XML <x number=<-number-> false=<-false-> url=<-url-> string=<-string-> word=<-word-> /> XML> pprint-xml ]
<?xml version="1.0" encoding="UTF-8"?> <x number="3" url="https://factorcode.org/" string="hello" word="drop"/>

XML interpolation can also be used, in conjunction with inverse in pattern matching. For example:
USING: xml.syntax inverse ; : dispatch ( xml -- string ) { { [ [XML <a><-></a> XML] ] [ "a" prepend ] } { [ [XML <b><-></b> XML] ] [ "b" prepend ] } { [ [XML <b val='yes'/> XML] ] [ "yes" ] } { [ [XML <b val=<->/> XML] ] [ "no" prepend ] } } switch ; [XML <a>pple</a> XML] dispatch write