非标准字符串文本如何避免标准字符串文本生成的语法错误?



根据 Julia 文档的相关部分,我的理解是像foo"hello, world"这样的非标准字符串文字等效于显式调用相应的宏:@foo_str("hello, world")。但是,一定有一些我不理解的额外魔法。考虑日期格式dateformat"m""m"本身会引发语法错误:

julia> "m"
ERROR: syntax: invalid escape sequence

如果我调用@dateformat_str("m"),也会抛出相同的语法错误,因为字符串文字"m"在传递给宏之前似乎经过计算或错误检查:

julia> using Dates
julia> @dateformat_str("m")
ERROR: syntax: invalid escape sequence

但是,使用非标准字符串文字可以:

julia> dateformat"m"
dateformat"m"

这是违反直觉的,因为我认为dateformat"m"等同于@dateformat_str("m")。非标准字符串文本如何避免标准字符串文本生成的语法错误?

简而言之,因为解析器识别这种情况并以不同的方式解析字符串

文字对于字符串宏调用,它会执行此操作。 呼叫:parse-raw-literal

至于普通字符串文字,它会这样做。 呼叫parse-string-literal


另一方面,@dateformat_str("m")解析为对普通字符串文字的宏调用。 所以它使用后面的parse-string-literal,这是错误的。

请注意,解析它的人已将字符串解析为转义为"\m"

julia> dump(:(dateformat"m"))
Expr
head: Symbol macrocall
args: Array{Any}((3,))
1: Symbol @dateformat_str
2: LineNumberNode
line: Int64 1
file: Symbol REPL[6]
3: String "\m

相关的兴趣是原始字符串宏,它什么都不做,但仍将使用parse-raw-literal进行字符串解析 它基本上定义为

macro raw_str(s)
return s
end

最新更新