scope of expressions and variables in Julia macro in modules
由于某些原因,我不得不在宏中放入
1 2 3 4 5 6 7 8 9 10 11 | macro addsum_out() quote ex = :(x+y) sum(eval(ex)) end end x = [1 1 1] y = [2 2 2] z2 = @addsum_out |
将宏放入模块后,它将不再起作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
它说:
1 | ERROR: LoadError: UndefVarError: x not defined |
我认为我应该将
这里的问题是,引用
这是宏观卫生的一部分。
为防止发生宏卫生问题,您需要
您的完整解决方案可能如下所示:
1 2 3 4 5 | macro addsum_out() quote esc(x) + esc(y) end end |
或更简而言之:
1 2 3 | macro addsum_out() :( esc(x) + esc(y) ) end |
请注意,这与
我整理的指南中对此主题进行了一些讨论:
https://github.com/p-i-/MetaGuideJulia/wiki#example-swap-macro-to-illustrate-esc