对非 Rust 源代码字符串使用 `stringify!`,例如 SQL 查询

Kil*_*ilo 2 sql rust

TL;DR Rust 是否为其词法分析器的行为提供特定的稳定性保证,特别是关于它如何词法非 Rust 源代码?

对于上下文:

我突然想到这是可能的:

let query = stringify!(
    CREATE TABLE table (
        row TEXT NOT NULL,
        another_row TEXT NOT NULL,
    );
);
Run Code Online (Sandbox Code Playgroud)

query现在将&'static str包含一个 SQL 查询,可与正在使用的任何 SQL 库一起使用。这可以直接替代代码中的任何嵌入式查询。显然存在一些问题,然后还有为什么的问题,但这些都不是重点。

是否可以依赖 Rust 词法分析器在未来的更新中不会破坏此代码?

感谢您抽出时间回复。

kmd*_*eko 5

我不建议用于stringify!非 Rust 代码。

宏在词法分析后获取其输入标记,这意味着空格大部分被删除(除了其间距指示其是否位于另一个符号旁边的符号)。除此之外,其余的源代码都可用,因此您几乎可以创建任何 DSL。

但使用的问题stringify!是,它不一定会生成一个字符串,该字符串尊重您的 DSL 根据给定的标记对符号的理解。特别是,当前的实现似乎会生成类似 Rust 的间距。因此,在其他语言中有意义的非 Rust 符号组合可能会被分开。

例子:

fn main() {
    let sql_statement = stringify!(SELECT [1,2] @> [3,4]);
    dbg!(sql_statement);
}
Run Code Online (Sandbox Code Playgroud)
[src/main.rs:3] sql_statement = "SELECT [1, 2] @ > [3, 4]"
Run Code Online (Sandbox Code Playgroud)

这是无效的 Postgres 运算符@>

fn main() {
    let python_code = stringify!(1 ** 2);
    dbg!(python_code);
}
Run Code Online (Sandbox Code Playgroud)
[src/main.rs:3] python_code = "1 * * 2"
Run Code Online (Sandbox Code Playgroud)

这是一个无效的 Python 求幂运算符**

此外,文档中还提到:

请注意,输入标记的扩展结果将来可能会发生变化。如果您依赖输出,则应该小心。