首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用几个模块的Julia - Metaprogramming

使用几个模块的Julia - Metaprogramming
EN

Stack Overflow用户
提问于 2022-02-07 21:22:39
回答 1查看 112关注 0票数 4

我在用朱莉娅来给学生打分。我将它们的所有文件Student1.jlStudent2.jl等作为单独的模块( Student1Student2等)放在一个目录中,该目录是LOAD_PATH的一部分。我想要做的工作在REPL中完全正常,但在文件中失败。

代码语言:javascript
复制
macro Student(number)
    return Meta.parse("Main.Student$number")
end

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

在REPL中工作非常好。但是,由于我是在脚本中运行这个程序的,所以我需要能够包含具有更多元编程的模块,这些元编程目前无法工作。我本以为上面的脚本会在文件Autograder.jl中通过调用

代码语言:javascript
复制
@eval(using Student1)
@Student(1).call_function(inputs)

module Autograder中。但我可以得到一个UndefVarError: Student1 not definedLoadError: cannot replace module Student1 during compilation,这取决于我如何调整事情。

朱莉娅元编程中有什么小的东西吗?我在这里遗漏了一些东西,以使这个自动评分系统工作起来?谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,需要相应地修改宏:

代码语言:javascript
复制
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

就我个人而言,我不会使用宏来实现这一点,这里有一个可能的选择:

代码语言:javascript
复制
student(id) = Base.require(Main, Symbol("Student$(id)"))
let student_module = student(1)
    student_module.call_function(inputs)
end

或者不修改LOAD_PATH

代码语言:javascript
复制
student(id) = include("modules/Student$(id).jl")
let student_module = student(1)
    student_module.call_function(inputs)
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71025564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档