Engee 文档
Notebook

.jl文件:应用方案和功能

本评论涉及.jl 文件。具体来说,这些应用包括

  • 创建自定义模块
  • 使用某些脚本
  • 代码调试
  • 运行服务器应用程序

创建自定义模块

.ngscript 文件不同,扩展名为.jl 的文件可用于创建自定义模块。

让我们考虑 2 个文件。 1.MyModule.jl 2._MyScriptModule.ngscript

两个文件都包含内容相同的模块:MyModuleMyScriptModule 。 但对于.jl 文件,我们可以使用以下方式连接模块:

In [ ]:
include("MyModule.jl")
using .MyModule

area(Rectangle(2,3))

但如果使用.ngscript ,则无法连接模块:

In [ ]:
try
    include("_MyScriptModule.ngscript")
    using .MyScriptModule

    area(Rectangle(2,3))
catch e 
    println(e)
end
LoadError("/user/start/examples/project_management/jl_files_usage/_MyScriptModule.ngscript", 1, ErrorException("syntax: { } vector syntax is discontinued around /user/start/examples/project_management/jl_files_usage/_MyScriptModule.ngscript:1"))

自动执行操作

假设有一张学生及其作业库的表格。

| Git 仓库 | ------- | --- | --- | --------------------------------------- | | Ivanov | I. | I. | git@github.com:Ivanov/Julia_course.git | git@github.com:Ivanov/Julia_course.git | | 帕洛夫 | P. | P. | | | | | | | | Petrov | P. | P. | git@github.com:Petrov/Julia_course.git | | Sidorov | I. | P. | git@github.com:Sidorov/Julia_course.git | git@github.com:Sidorov/Julia_course.git |

一位教师同时向几个小组教授一门课程。


然后,使用.jl 文件,可以检查家庭作业、 将所有文件自动复制到相应 文件所在的同一目录中。 相应的.jl 文件所在的同一目录。


注意,现在目录中没有文件夹。

让我们执行下面的单元格来重现这种情况。 执行单元代码后,目录中将出现文件夹:

jl-files
伊万诺夫
│ └──── Seminar_1
├─── 彼得罗夫
│ └──── Seminar_1
└──── Sidorov
    └───研讨会_1

下一个单元格将对执行的内容进行说明。

In [ ]:
run(`bash -c """

julia generate_student_folders.jl students_group_1.csv Семинар_1

"""`)
ARGS = ["students_group_1.csv", "Семинар_1"]
df = 4×4 DataFrame
 Row │ Фамилия   И.       О.       GitHub
     │ String15  String3  String3  String?
─────┼───────────────────────────────────────────────────────────────
   1 │ Иванов    И.       И.       git@github.com:Ivanov/Julia_cour…
   2 │ Павлов    П.       П.       missing
   3 │ Петров    П.       П.       git@github.com:Petrov/Julia_cour…
   4 │ Сидоров   И.       П.       git@github.com:Sidorov/Julia_cou…
Out[0]:
Process(`bash -c '

julia generate_student_folders.jl students_group_1.csv Семинар_1

'`, ProcessExited(0))
  • 函数run 可以运行命令。 -bash -c 表示 "在 bash shell 中执行 命令"。 -julia -juila программа.jl аргумент_1 аргумент_2 ... -generate_student_folders.jl - 创建文件夹并克隆学生资源库的文件 -ARGS[1] - 包含数据的文件名 (students_group_1.csv) -ARGS[2] - 要检查的班级/作业的名称 (Семинар_1)
为什么不用类似的功能替换generate_student_folders.jl 脚本?

使用脚本的方便之处在于,在脚本中,与函数不同,您可以使用usingimport.

也就是说,我们可以调用一个单独的进程$\rightarrow$ ,在其中连接包$\rightarrow$ ,执行操作$\rightarrow$ ,然后返回主程序。

请注意,我们在程序generate_student_folders.jl 中使用了软件包CSV ,但这个软件包在我们的脚本中没有连接。

In [ ]:
try
    df = CSV.read("students_group_1.csv", DataFrame);
catch e 
    sprint(showerror,e)
end
Out[0]:
"UndefVarError: `CSV` not defined"

代码调试

虽然脚本中也可以进行代码调试,但.jl 文件比脚本更有优势。原因就在这里:

.ngscript 代表json 文件。

例如,_sqrt_16.ngscript 文件是一个json 文件,其中有

# 文件中关于第一个文本格的部分

      "id": "ffe36da1"、
      "cell_type": "markdown"、
      }, "source":[
        "Value$\\sqrt{16}$"
      ],
# 关于第一个单元格的部分代码

      "id": "a4b6a26f"、
      "cell_type": "code"、
      "源":[
        "sqrt(16)" [
      ],

因此,调试这样的文件实际上是一项非同小可的任务。 让我们确保

调试.ngscript 文件

让我们在当前.ngscript- 文件中创建函数circle_area

In [ ]:
"Площадь круга по радиусу"
function circle_area(r)
  π*r^2
end
Out[0]:
circle_area

通过@functionloc ,我们可以找到文件名和要调用的方法的字符串。

In [ ]:
@functionloc circle_area(2)
Out[0]:
(nothing, 2)

我们可以看到,文件名没有返回,而字符串是单元格的第 2 行(在我们的函数 "圆面积乘半径 "的描述之后)。

调试.jl-files

.jl-files 就没有这个问题。文件MyModule.jl 中声明的函数area 的位置打印得非常清楚:

In [ ]:
@functionloc area(Rectangle(2,3))
Out[0]:
("/user/jl-files/MyModule.jl", 17)

otladka.png

.jl-作为应用程序一部分的文件

例如,要使用 Genie开发应用程序,需要在应用程序目录内创建.jl 文件,而不是脚本。

因此,应用程序的主文件应该是一个名为app.jl 的文件。