在字符串宏中实现插值

字符串宏没有内置插值功能。但是,可以手动实现此功能。请注意,如果没有转义与周围字符串宏具有相同分隔符的字符串文字,则无法嵌入; 也就是说,尽管 """ $("x") """ 是可能的,但 " $("x") " 却不是。相反,这必须作为 " $(\"x\") " 进行转义。有关此限制的更多详细信息,请参阅备注部分。

手动实现插值有两种方法:手动实现解析,或让 Julia 进行解析。第一种方法更灵活,但第二种方法更容易。

手动解析

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

这种方法转义字符串(但要注意 escape_string没有转义 $ 标志),并把它回 Julia 的解析器来解析。转义字符串是必要的,以确保 "\不会影响字符串的解析。得到的表达式是:string 表达式,可以检查和分解以用于宏观目的。