macros - 在语法扩展中使用程序标识符

标签 macros rust

在 Rust 语法扩展中,我如何使用程序范围内的标识符?

例如,假设我有以下代码:

fn test() {
    let name = "test";
    let result = my_macro!();
}

我尝试按如下方式定义程序宏:

fn expand_my_macro(cx: &mut ExtCtxt, sp: Span, args: &[TokenTree]) -> Box<MacResult + 'static> {
    MacEager::expr(cx.expr_ident(sp, Ident::with_empty_ctxt(intern("name"))))
}

但是,我收到以下错误:

error: unresolved name `name` [E0425]

在用户代码中。

我知道普通的 Rust 宏是卫生的,但是过程宏呢?

有没有一种方法可以做到这一点而不必将变量 name 作为参数传递?

最佳答案

我不这么认为。问题是,为了匹配现有的 name 标识符,您需要知道它的语法上下文:标识符相等比较文本名称​​和 完全符合语法上下文。

这是一个问题,因为您没有被告知,也无法知道周围的语法上下文是什么

如果你想引用它,你必须将标识符传递给宏。

关于macros - 在语法扩展中使用程序标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32959672/

相关文章:

rust - 有没有一种方法可以设置Clap或另一个arg lib来接受普通的 '-'或 '+',这样我就可以获得没有命名标志的参数组?

logging - 如何实现附加到文件的记录器?

http - 如何通过 TcpStream 将 .jpg 作为 HTTP 发送?

function - 在 dolist 中扩展宏

macros - 是否可以定义一个宏来从数字生成所有枚举值的静态数组?

scala - 我在哪里可以了解如何为 Scala 宏构建 AST?

vba - 使用命令按钮更改单元格颜色(VBA Excel)

python - PyCharm:在区域上运行 `black -S`

rust - 有没有一种方法可以注释一个在rust中采用可选闭包的函数?

rust - 为什么我可以直接匹配一个Options数组而不是一个包含Options数组的变量?