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

Julia宏动态编码变量,如创建一组数据帧,julia,Julia,我正在学习宏,所以我想一个简单的步骤就是编写一个宏,根据数据帧对变量进行编码。我可以通过dfn手动设置df1,但我不想 例如: macro mac(i) quote df$i = DataFrame(CSV.File("~/dev/book$i.csv")) end end 如果我测试,结果是2,但结果是一些奇怪的字符串 @mac(2) df2 >> #416#$ 宏中的变量是“随机化”的,以避免与宏展开所在代码中的变量冲

我正在学习宏,所以我想一个简单的步骤就是编写一个宏,根据数据帧对变量进行编码。我可以通过dfn手动设置df1,但我不想

例如:

macro mac(i)
    quote
        df$i = DataFrame(CSV.File("~/dev/book$i.csv"))
    end
end
如果我测试,结果是2,但结果是一些奇怪的字符串

@mac(2)

df2 
>> #416#$

宏中的变量是“随机化”的,以避免与宏展开所在代码中的变量冲突,请参阅关于一节,特别是关于一节。是一个非常有用的工具,它可以让您查看扩展的代码并使调试更容易

在这种情况下,您需要输入符号

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

有比使用元编程更简单的工具来实现这一点。最简单的方法是定义一个函数,返回所需的
DataFrame

load_df(i) = DataFrame(CSV.File("~/dev/book$i.csv"))
然后可以使用与宏基本相同的方法

julia> df2 = load_df(2)
要一次加载所有这些文件,您可以使用


这是绝对正确的。您建议的代码可以更简单、更实用地完成这项工作。然而,我的目的只是更多地了解它如何与宏一起工作。使用生成的名称动态创建变量不是一个好主意。这就是阵列的用途。制作一个数据帧数组,并以
df[1]
df[2]
等方式访问它们。
dfs = [DataFrame(CSV.File("~/dev/book$i.csv")) for i in irange]
df2 = dfs[2]