如何编写 body 包含用户定义符号的宏?

How to write a macro whose body contains a user defined symbol?

我打算创建一个具有以下行为的宏:

@pass_symbol sym func

扩展为:

func(:sym)

以下实验没有产生任何结果:

macro pass_symbol(symarg, funcarg) 
    quote 
         $funcarg($symarg)
         # turns into `func(sym)`
         # which results in an error 
         # as `sym` is not defined
    end
end

macro pass_symbol(symarg, funcarg) 
    quote 
         # combinations of
         $funcarg($(Symbol(symarg)))
         # or
         $funcarg(Symbol(symarg))
         # turns into `func(Symbol(sym))`
         # which for the same reason detailed 
         # above results in an error
    end
end

macro pass_symbol(symarg, funcarg)
    quote
        $funcarg(:$symarg)
        # I wished to escape the ":" 
        # so that it would expand into func(:sym) 
        # but it didn't manage to
        # evaluate `:` and `$` separately 
    end
end

我确实尝试了更多恶作剧。 最终,我找到了这个:

macro pass_symbol(symarg, funcarg)
    str = ":$symarg"
    quote
        $funcarg($(Meta.parse(str)))
    end
end

但我对此并不满意,因为我觉得必须有一种更惯用的方法来实现这一点。

请随意建议一个更合适的标题,因为我找不到任何与使用 google 相关的内容,我希望它具有良好的 search-ability。

macro pass_symbol(symarg, funcarg)
    quote
        $funcarg($(Expr(:quote, (symarg))))
    end
end

或者更简洁:

macro pass_symbol(symarg, funcarg)
    quote
        $funcarg($(QuoteNode(symarg)))
    end
end

但我仍然不确定为什么 QuoteNode 按照文档实现了预期的行为:

A quoted piece of code, that does not support interpolation. See the manual section about QuoteNodes for details.

或者如果有办法解决这个问题: $funcarg(:$symarg)