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

时间:2014-10-28 02:50:56

标签: macros julia

我正在查看Julia中r_str宏的source,其中将r"text"解析为Regex("text")。第二个参数是flags...,它将标志传递给正则表达式,如i表示不区分大小写,依此类推。

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

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

julia> a"abc"iii
("iii",)"abc"

所以似乎iii全部作为第一个标志传入。在这种情况下,为什么标志上有...。是否可以将flags的多个元素传递给宏?

3 个答案:

答案 0 :(得分: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

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

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

julia> rm"foo bar baz"abc
"foo r z"

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

答案 1 :(得分:2)

我不相信这是可能的,documentation doesn't provide an example将会使用它。此外,mostly-fully-compliant JuliaParser.jl也不支持多个标志。也许在朱莉娅改变那个公开公关?

答案 2 :(得分:2)

使用显式调用,如

@a_str("abc", "iii", "jjj")

你可以传递多个标志。但我不知道如何使用a"abc"ijk语法来实现这一点。