Macros 有没有一种方法可以让Rust宏像C中那样充当文本替换?

Macros 有没有一种方法可以让Rust宏像C中那样充当文本替换?,macros,rust,preprocessor,Macros,Rust,Preprocessor,在C语言中,如果您愿意,您可以: #define do { #define end } // ... if (foo == bar) do foo += 5; bar /= foo; end 有没有一种方法可以在Rust中做类似的事情?没有(谢天谢地)。Rust宏必须始终扩展到完整的AST节点 如果需要文本替换,请使用适合该工作的工具,例如sed、awk、m4、C预处理器等,这些工具可能由构建脚本驱动。事实上,有一个玩具项目可以做到这一点:。不过,

在C语言中,如果您愿意,您可以:

#define    do     {
#define    end    }

// ...

if (foo == bar) do
    foo += 5;
    bar /= foo;
end
有没有一种方法可以在Rust中做类似的事情?

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


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

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

它附带了以下有用的建议:

我应该用这个吗? 否。请使用默认的rust语法


我不需要它本身,只是括号对我来说太可怕了,因为我在一些语言中工作了相当长的一段时间,这些语言在很大程度上放弃了python、haskell、f#、matlab等概念,并在寻找一种使语法更漂亮的方法。@RaresDima直截了当地说,我认为这正是成为一名专业程序员所需要克服的。不同的语言有不同的语法、习语、命名惯例、缩进风格等。在罗马,就像罗马人一样。如果你用关键字替换卷发,或者你让它对空格敏感,你就不会再写了。然后你必须将你所看到的每一个例子翻译成你的方言,当你请求帮助时,你需要翻译回来,你得不到编辑或工具的帮助。在这一点上,您最好只编写自己的语言。@RaresDima此外,使用简单的文本替换不是一个好方法。这并不能回答问题:“有没有一种方法可以让Rust宏像在C中一样充当文本替换?”它也不能回答以下隐含的问题:“我可以用do/end块代替花括号吗?”因为矿渣是对空格敏感的。这最好作为一个评论。@Shepmaster是的,说得好。我想我发帖是为了回答后续评论而不是原始问题。