根据Julia文档的相关部分,我的理解是,像这样的非标准字符串文字foo"hello, world"等效于显式调用相应的宏:@foo_str("hello, world")。但是,肯定还有一些我不了解的魔术。考虑日期格式dateformat"\m"。本身"\m"会引发语法错误:
julia> "\m"
ERROR: syntax: invalid escape sequence
Run Code Online (Sandbox Code Playgroud)
如果我调用@dateformat_str("\m"),则会引发相同的语法错误,因为字符串文字"\m"在传递给宏之前似乎已经过评估或检查了错误:
julia> using Dates
julia> @dateformat_str("\m")
ERROR: syntax: invalid escape sequence
Run Code Online (Sandbox Code Playgroud)
但是,使用非标准字符串文字可以工作:
julia> dateformat"\m"
dateformat"\m"
Run Code Online (Sandbox Code Playgroud)
这是违反直觉的,因为我认为这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
Run Code Online (Sandbox Code Playgroud)
与此相关的是原始字符串宏,它根本不做任何事,但仍然要使用字符串解析的parse-raw-literal
它基本上是定义为
macro raw_str(s)
return s
end
Run Code Online (Sandbox Code Playgroud)