【问题标题】:Why do string macros in Julia use ...?为什么 Julia 中的字符串宏使用 ...?
【发布时间】:2014-10-28 02:50:56
【问题描述】:

我正在查看 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 的元素传递给宏?

【问题讨论】:

    标签: macros julia


    【解决方案1】:

    最初提出这个问题时,宏扩展器(即使用 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”)。在这种情况下,使用带有默认值的第二个参数的新方法是最简单和最清晰的,因为在许多情况下都会如此,但现在您可以使用最适合这种情况的方法。

    【讨论】:

      【解决方案2】:

      像这样的显式调用

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

      您可以传递多个标志。但我不知道有一种方法可以使用 a"abc"ijk 语法进行这项工作。

      【讨论】:

        【解决方案3】:

        我不相信这是可能的,documentation doesn't provide an example 将在其中使用。此外,mostly-fully-compliant JuliaParser.jl 也不支持多个标志。也许打开一个关于 Julia 的 PR 来改变这一点?

        【讨论】:

        • 更改它以允许它(这将如何工作?)或将其更改为在正则表达式示例中不使用...
        • 将其更改为不使用...。它可能曾经有用过,但现在看起来不再有用了。
        猜你喜欢
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多