Julia - 使用多个模块的元编程
Julia - Metaprogramming for using several modules
我正在使用 Julia 为学生的作业自动评分。我将他们的所有文件 Student1.jl
、Student2.jl
等作为单独的模块 Student1
、Student2
等保存在属于 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 defined
或 LoadError: 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
我正在使用 Julia 为学生的作业自动评分。我将他们的所有文件 Student1.jl
、Student2.jl
等作为单独的模块 Student1
、Student2
等保存在属于 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 defined
或 LoadError: 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