【问题标题】:Is there a way for Rust macros to act as text substitutions like in C?有没有办法让 Rust 宏像 C 中那样充当文本替换?
【发布时间】:2018-07-14 18:12:12
【问题描述】:

在 C 中,如果你愿意,你可以:

#define    do     {
#define    end    }

// ...

if (foo == bar) do
    foo += 5;
    bar /= foo;
end

有没有办法在 Rust 中做这样的事情?

【问题讨论】:

    标签: macros rust preprocessor


    【解决方案1】:

    没有(谢天谢地)。 Rust 宏必须始终扩展为完整的 AST 节点。

    如果您需要文本替换,请使用适合该工作的工具,例如 sedawkm4、C 预处理器等。这可能由构建脚本。

    【讨论】:

    • 我本身不需要它,只是括号对我的眼睛来说太可怕了,因为我在很长一段时间内使用的语言大部分都放弃了诸如 python、haskell、f#、matlab 之类的概念等,并且正在寻找一种使语法更漂亮的方法。
    • @RaresDima 坦率地说,我认为这只是成为一名专业程序员需要克服的问题。不同的语言有不同的句法、习语、命名约定、缩进样式等。在罗马时,像罗马人那样做。如果你用关键字替换 curlies 或者如果你让它对空格敏感,你不再写 Rust。然后,您必须将您看到的每个示例翻译成您的方言,在寻求帮助时翻译回来,您无法从编辑器或工具中获得帮助。到那时,你不妨只写自己的语言。
    • @RaresDima 此外,用简单的文本替换这样做不是一个好方法。
    【解决方案2】:

    实际上有一个玩具项目可以做到这一点:slag。不过,我从未尝试过。

    它带有这个有用的建议:

    我应该使用这个吗?

    没有。使用默认的 rust 语法。

    【讨论】:

    • 这没有回答这个问题:“有没有办法让 Rust 宏像在 C 中一样充当文本替换?”它也没有回答隐含的问题“我可以使用 do/end 块而不是花括号吗?”因为渣是空白敏感的,而不是。最好作为评论。
    • @Shepmaster 是的,公平点。我想我发帖是为了回答后续评论,而不是最初的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多