为什么Julia中的字符串宏使用...?

asm*_*rer 2 macros julia

我一直在寻找在对于r_str在朱莉娅宏,它分析r"text"Regex("text").第二个参数是flags...,它将标志传递给正则表达式,就像i不区分大小写一样,依此类推.

我自己正在玩这个并得到:

julia> macro a_str(p, flags...)
           print(flags)
           p
       end

julia> a"abc"iii
("iii",)"abc"
Run Code Online (Sandbox Code Playgroud)

所以它似乎iii都作为第一个标志传入.在那种情况下,为什么有...旗帜.是否可以将多个元素传递flags给宏?

Ste*_*ski 6

当最初询问这个问题时,宏扩展器 - 即用macro关键字定义的函数,被调用以将传递给宏的表达式转换为单个输出表达式 - 不是泛型函数,而是匿名函数,它们是Julia 0.4及更早版本中的另一种功能.在这一点上,编写可以用于一个或两个参数的匿名函数签名的唯一方法是使用尾随的varargs参数,这就是为什么这个模式用于定义字符串宏的原因.在Julia 0.5中,所有函数都已成为通用函数,包括匿名函数和宏展开器.因此,您现在可以通过各种方式编写宏,包​​括在字符串参数后使用varargs参数的旧方法:

# old style
macro rm_str(raw, rest...)
    remove = isempty(rest) ? "aeiouy" : rest[1]
    replace(raw, collect(remove), "")
end

# new style with two methods
macro rm_str(raw)
    replace(raw, ['a','e','i','o','u','y'], "")
end
macro rm_str(raw, remove)
    replace(raw, collect(remove), "")
end

# new style with default second argument
macro rm_str(raw, remove="aeiouy")
    replace(raw, collect(remove), "")
end
Run Code Online (Sandbox Code Playgroud)

这些都导致相同的非标准字符串文字行为:

julia> rm"foo bar baz"
"f br bz"

julia> rm"foo bar baz"abc
"foo r z"
Run Code Online (Sandbox Code Playgroud)

字符串文字生成带有标记字母的字符串,默认为剥离所有ASCII元音("aeiouy").在这种情况下,使用带有默认值的第二个参数的新方法是最简单和最清晰的,因为在许多情况下它会是这样,但现在您可以使用最适合这种情况的方法.