【发布时间】:2014-09-07 01:03:16
【问题描述】:
我正在尝试在 Julia 中编写一个简单的 swap! 宏,以了解宏系统。到目前为止,这是我的代码:
macro swap!(x, y)
quote
local tmp = $(esc(y))
$x = $(esc(y))
$y = tmp
end
end
a = 1
b = 2
@swap!(a, b)
# prints: a: 1, b: 2
println("a: $a, b: $b")
这运行没有错误,但实际上并没有改变值。 Julia 似乎没有一个只扩展宏而不执行它们的函数(据我所知),所以这很难调试。
REPL 中的等效引用似乎按预期工作:
julia> a = 1
1
julia> a_sym = :a
:a
julia> a_sym
:a
julia> b = 2
2
julia> b_sym = :b
:b
julia> eval(quote
tmp = $a_sym
$a_sym = $b
$b_sym = tmp
end)
1
julia> a
2
julia> b
1
我做错了什么?
【问题讨论】:
-
你确定
a, b = b, a分配不够吗? -
@juliom 当然可以,但我的目的是学习 Julia 宏。
-
Julia 确实有宏扩展。调用它虽然有点棘手。
macroexpand(:(@swap x, y))