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 词法分析器在未来的更新中不会破坏此代码?
感谢您抽出时间回复。
我不建议用于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 求幂运算符**
此外,文档中还提到:
请注意,输入标记的扩展结果将来可能会发生变化。如果您依赖输出,则应该小心。