Julia - 使用多个模块的元编程

Julia - Metaprogramming for using several modules

我正在使用 Julia 为学生的作业自动评分。我将他们的所有文件 Student1.jlStudent2.jl 等作为单独的模块 Student1Student2 等保存在属于 LOAD_PATH 的目录中。我希望能够在 REPL 中完全正常工作,但在文件中失败。

macro Student(number)
    return Meta.parse("Main.Student$number")
end

using Student1
@Student(1).call_function(inputs)

在 REPL 中完全可以正常工作。但是,由于我在脚本中 运行 this,我需要能够包含具有更多当前无法正常工作的元编程的模块。我原以为上面完全相同的脚本可以通过调用

在文件 Autograder.jl 中运行
@eval(using Student1)
@Student(1).call_function(inputs)

module Autograder 中。但是我得到 UndefVarError: Student1 not definedLoadError: cannot replace module Student1 during compilation 取决于我如何调整。

我在这里缺少 Julia 元编程中的一些小东西来使这个自动评分系统正常工作吗?感谢您的任何建议。

您为我编写的代码适用于 julia 版本 1.1.0、1.3.1、1.5.1、1.6.0 和 1.7.0。我的意思是,如果我添加一个 inputs 变量并将您的第一个代码块放在文件 Autograder.jl 和 运行 JULIA_LOAD_PATH="modules:$JULIA_LOAD_PATH" julia Autograder.jl 中,学生模块在 modules 目录我在 Student1 模块中得到 call_function 函数的输出。

然而,如果 Autograder.jl 实际上包含一个模块,那么 Student$number 模块不需要进入 Main 并且您的宏需要相应地修改:

module Autograder
macro Student(number)
    return Meta.parse("Student$number") # or "Autograder.Student$number"
end

inputs = []
@eval(using Student1)
@Student(1).call_function(inputs)
end

就我个人而言,我不会使用宏来完成此操作,这是一个可能的替代方法:

student(id) = Base.require(Main, Symbol("Student$(id)"))
let student_module = student(1)
    student_module.call_function(inputs)
end

或不修改 LOAD_PATH:

student(id) = include("modules/Student$(id).jl")
let student_module = student(1)
    student_module.call_function(inputs)
end