我在用朱莉娅来给学生打分。我将它们的所有文件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中工作非常好。但是,由于我是在脚本中运行这个程序的,所以我需要能够包含具有更多元编程的模块,这些元编程目前无法工作。我本以为上面的脚本会在文件Autograder.jl中通过调用
@eval(using Student1)
@Student(1).call_function(inputs)在module Autograder中。但我可以得到一个UndefVarError: Student1 not defined或LoadError: cannot replace module Student1 during compilation,这取决于我如何调整事情。
朱莉娅元编程中有什么小的东西吗?我在这里遗漏了一些东西,以使这个自动评分系统工作起来?谢谢你的建议。
发布于 2022-02-08 10:53:48
代码就像您在julia版本1.1.0、1.3.1、1.5.1、1.6.0和1.7.0上为我编写的一样。我的意思是,如果我添加了一个inputs变量,并将第一个代码块放入文件Autograder.jl中,然后在modules目录中运行JULIA_LOAD_PATH="modules:$JULIA_LOAD_PATH" julia Autograder.jl和学生模块,我将在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)
endhttps://stackoverflow.com/questions/71025564
复制相似问题