从宏中创建一个具有给定名称的局部变量?
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
好吧,我认为这可能是让您感到困惑的部分:您不必转义属性本身就可以避免变量 gensym
ed。
相反,您想转义符号:
macro deffunc(fname, arg, body)
fname = esc(fname) # this returns `$(Expr(:escape, :f))`
e = quote
$fname($arg) = $body
end
end
我打算创建一个具有以下行为的宏:
@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
好吧,我认为这可能是让您感到困惑的部分:您不必转义属性本身就可以避免变量 gensym
ed。
相反,您想转义符号:
macro deffunc(fname, arg, body)
fname = esc(fname) # this returns `$(Expr(:escape, :f))`
e = quote
$fname($arg) = $body
end
end