あなたは非常に接近していました!
マクロがあまりにも型注釈を持つことができます:)、彼らはコンパイル時に働く機能ですが、それらの入力だけExpr
秒、Symbol
秒または定数値、すなわちことができます:Int
、マクロがされる前に、それらの入力を評価しません。呼び出される前に呼び出される関数のように、マクロは構文を処理します。
julia> macro m(a::Symbol, b) # in ths method a should allways be a symbol
# use spaces and parens as needed to delimit and
# group args as needed, not commas in this case
@show a b # or use this: @show(a, b) notice comma here
ex = quote # there is no need to use eval here a macro
$a = $b # will compile and evaluate the returning
end # expression when invoked
@show ex
return esc(ex) # esc will use surrounding scope instead of gensyms
end
@m (macro with 1 method)
は、それが返される式の本体である。この場合には、マクロの本体内
eval
を使用しないでください(そこにこれが必要になることができた例はあるが、これはその一つではありません)。正直なところ、私は
@eval
または
[email protected]
仕事のようなマクロに似て補間を作る方法をまだ知らない(マニュアルで説明されなければならない、私はこれらのマクロのコードを勉強する必要があります)
julia> x = 2
2
、しかし、あなたはドン」あなたの簡単な例のためにここでマクロを呼び出すときは、$
が必要です。
julia> @m y (x + 1) # parens for grouping, or @m(y, x + 1)
a = :y # :y is a symbol
b = :(x + 1)
ex = quote
#= REPL[17]:4 =#
y = x + 1
end
3
あなたがesc
を使用しない場合には、衛生的ではなく、周囲のスコープ変数を使用して、この場合には、gensym
Sを作成します。このような
julia> @m z rand(x, y)
a = :z
b = :(rand(x, y))
ex = quote
#= REPL[17]:4 =#
z = rand(x, y)
end
2×3 Array{Float64,2}:
0.817233 0.623775 0.277464
0.421573 0.443654 0.296359
gensym
の表情: `@ eval`と` BenchmarkToolsに言及するため
julia> gensym(:foo)
Symbol("##foo#924")
感謝@ btime'。私は似たようなことをしたいが、まだ彼らのコードを理解していない。 – Phuoc
[MacroTools.jl](https://github.com/MikeInnes/MacroTools.jl)も必ずチェックしてください。 – SalchiPapa