String macros do not come with built-in interpolation facilities. However, it is possible to manually implement this functionality. Note that it is not possible to embed without escaping string literals that have the same delimiter as the surrounding string macro; that is, although """ $("x") """
is possible, " $("x") "
is not. Instead, this must be escaped as " $(\"x\") "
. See the remarks section for more details about this limitation.
There are two approaches to implementing interpolation manually: implement parsing manually, or get Julia to do the parsing. The first approach is more flexible, but the second approach is easier.
macro interp_str(s)
components = []
buf = IOBuffer(s)
while !eof(buf)
push!(components, rstrip(readuntil(buf, '$'), '$'))
if !eof(buf)
push!(components, parse(buf; greedy=false))
end
end
quote
string($(map(esc, components)...))
end
end
macro e_str(s)
esc(parse("\"$(escape_string(s))\""))
end
This method escapes the string (but note that escape_string
does not escape the $
signs) and passes it back to Julia's parser to parse. Escaping the string is necessary to ensure that "
and \
do not affect the string's parsing. The resulting expression is a :string
expression, which can be examined and decomposed for macro purposes.