从宏中创建一个具有给定名称的局部变量?

Create a local variable with a given name from within a macro?

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

@deffunc f x x+x

扩展为:

f(x) = x+x

并正确地将具有给定名称的函数添加到调用宏的范围中,在本例中为 f

在阅读了宏并搜索了类似的相关问题后,我无法找到一种方法来实现这一点,而 必须逃避整个属性本身 ,因此,整个宏观:

macro deffunc(fname, arg, body)
    e = quote
        $fname($arg) = $body
    end
    esc(e)
end

但在它的圣洁中逃离它对我来说似乎是不可取的。

我试图找到更好的方法,比如加入引号但无济于事,然后我按照以下方式四处寻找:

macro deffunc(fname, arg, body)
    e = quote
        $fname($arg) = $body
    end
    e = esc(e)
    quote
        $e
    end
end

但这太丑了,我觉得我错过了一些简单的东西。

having to escape the whole attribution itself

好吧,我认为这可能是让您感到困惑的部分:您不必转义属性本身就可以避免变量 gensymed。

相反,您想转义符号:

macro deffunc(fname, arg, body)
    fname = esc(fname) # this returns `$(Expr(:escape, :f))`
    e = quote
        $fname($arg) = $body
    end
end