由于某种原因,我必须在宏中放置
quote
...end
块,并且ex
是通过程序生成的。这段代码可以正常工作。macro addsum_out()
quote
ex = :(x+y)
sum(eval(ex))
end
end
x = [1 1 1]
y = [2 2 2]
z2 = @addsum_out
当将宏放置在模块中时,它不再起作用:
module MyModule
export @addsum
macro addsum()
quote
ex = :(x+y)
sum(eval(ex))
end
end
end
using MyModule
x = [1 1 1]
y = [2 2 2]
z = @addsum
It says:
ERROR: LoadError: UndefVarError: x not defined
我认为我应该在某个地方放置esc
,以便在模块外的主范围内评估表达式ex
。我该如何处理这个问题?
eval
。你想做什么? - David P. Sanderseval
在模块全局范围内运行。看一下macroexpand( :(@addsum) )
并注意到MyModule.eval
。无论如何,这是完全不必要的。你应该返回esc(:(x + y))
。 - Isaiah Norton