Julia 宏动态编码变量,例如创建一组数据帧

neu*_*ino 3 julia

我正在尝试学习宏,所以我认为一个简单的步骤是编写一个基于数据帧对变量进行编码的宏。我可以通过 df n手动设置 df1 ,但我不想。

例如 :

macro mac(i)
    quote
        df$i = DataFrame(CSV.File("~/dev/book$i.csv"))
    end
end
Run Code Online (Sandbox Code Playgroud)

如果我测试,进入 2,但所有出来的都是一些奇怪的字符串。. .

@mac(2)

df2 
>> #416#$

Run Code Online (Sandbox Code Playgroud)

fre*_*kre 6

宏中的变量是“随机化的”,不会与宏展开的代码中的变量发生冲突,请参阅有关元编程的部分,特别是有关宏卫生的部分。@macroexpand是一个非常有用的工具,可以让您查看扩展的代码并使其更易于调试。

在这种情况下,您需要“转义”该符号。

julia> macro mac(i)
           quote
               df$i = DataFrame(CSV.File("book$i.csv"))
           end
       end
@mac (macro with 1 method)

julia> macro mac2(i)
           quote
               $(esc(Symbol("df$i"))) = DataFrame(CSV.File("book$i.csv"))
           end
       end
@mac2 (macro with 1 method)

julia> @macroexpand @mac 1
quote
    #= REPL[10]:3 =#
    var"#4#\$"(var"#5#df", var"#6#i") = begin
            #= REPL[10]:3 =#
            Main.DataFrame((Main.CSV).File("book$(var"#6#i").csv"))
        end
end

julia> @macroexpand @mac2 2
quote
    #= REPL[11]:3 =#
    df2 = Main.DataFrame((Main.CSV).File("book$(Main.i).csv"))
end
Run Code Online (Sandbox Code Playgroud)