Engee 文档
Notebook

恩吉的文件和文献

良好的文档是高质量理解和使用代码的关键。 Julia 语言可以让您轻松使用和创建开箱即用的文档。

本手册将介绍

  • .ngscript中获取帮助
  • 命令行中获取帮助
    • 函数
    • 全局变量
    • 结构
    • 模块

还将考虑创建和连接自己的模块的方法。

获取 .ngscript 帮助

要在.ngscript中获取帮助,需要使用宏@doc

考虑获取sqrt.ngscript 的帮助。

注意在文档中使用 *Markdown、$\LaTeX$ 和语法高亮。

In [ ]:
@doc sqrt
Out[0]:
sqrt(x)

Возвращает $\sqrt{x}$. Выдает ошибку DomainError при отрицательных аргументах типа Real. Используйте вместо этого комплексные отрицательные аргументы. Префиксный оператор эквивалентен sqrt.

См. также описание hypot.

Примеры

jldoctest;
julia> sqrt(big(81))
9.0

julia> sqrt(big(-81))
ERROR: DomainError with -81.0:
NaN result for non-NaN input.
Stacktrace:
 [1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]

julia> sqrt(big(complex(-81)))
0.0 + 9.0im

julia> .√(1:4)
4-element Vector{Float64}:
 1.0
 1.4142135623730951
 1.7320508075688772
 2.0
sqrt(A::AbstractMatrix)

Если матрица A не имеет отрицательных вещественных собственных значений, вычисляет натуральный квадратный корень матрицы A, то есть уникальную матрицу $X$ с собственными значениями, имеющими положительную вещественную часть, так что $X^2 = A$. В противном случае возвращается ненатуральный квадратный корень.

Если матрица A является симметричной или эрмитовой, для вычисления квадратного корня используется ее разложение по собственным значениям (eigen) . Для таких матриц собственные значения λ, которые из-за ошибок округления кажутся слегка отрицательными, рассматриваются как нулевые. Более точно, матрицы со всеми собственными значениями ≥ -rtol*(max |λ|) рассматриваются как полубесконечные (выдающие эрмитов квадратный корень), а отрицательные собственные значения принимаются за нуль. rtol является именованным аргументом для sqrt (только для эрмитовых или вещественно-симметричных матриц), который по умолчанию имеет машинную точность, масштабированную на size(A,1).

В противном случае квадратный корень определяется с помощью метода Бьорка-Хаммарлинга [^BH83], который вычисляет комплексную форму Шура (schur), а затем — комплексный квадратный корень треугольного множителя. Если вещественный квадратный корень существует, используется расширение этого метода [^H87], которое вычисляет вещественную форму Шура, а затем — вещественный квадратный корень квазитреугольного множителя.

[^BH83]: Åke Björck and Sven Hammarling, "A Schur method for the square root of a matrix", Linear Algebra and its Applications, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X80010-X)

[^H87]: Nicholas J. Higham, "Computing real square roots of a real matrix", Linear Algebra and its Applications, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-290118-2)

Примеры

jldoctest
julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
 4  0
 0  4

julia> sqrt(A)
2×2 Matrix{Float64}:
 2.0  0.0
 0.0  2.0

在命令行获取帮助

使用问号获取命令行帮助:?

screenshot_2024_11_21_135151.png

😊😊😊😊😊 如果你想扩展使用命令行的知识--请将文档阅读到底😊😊。

创建自己的文档

记录功能。

要为函数添加自己的文档,必须在函数名称前添加一行包含函数信息的行。

如果函数描述较长,建议使用 三重双引号

In [ ]:
"Краткое описание функции, здоровающейся с пользователем"
function user_greeting(username::String)
    return "Hello, $(username)!"
end
Out[0]:
user_greeting
In [ ]:
@doc user_greeting
Out[0]:

Краткое описание функции, здоровающейся с пользователем

让我们简要考虑一下为什么需要使用\$ мы используем raw - литерал необработанных строк:

В LaTex мы используем $\nu$ для обозначения символа ню: $\nu$

Здесь сразу может возникнуть множество проблем. Внутри " "

因此。 "$\nu$"将无法正确执行。不过,这个问题可以通过使用raw-strings 来解决

In [ ]:
# "$\nu$" # вызовет ошибки
In [ ]:
@show raw"$\nu$";
raw"$\nu$" = "\$\\nu\$"
In [ ]:
@doc raw"""
Документация, содержащая:

1. Markdown:
    - маркеры списка
    - [внешние ссылки](https://engee.com/helpcenter/stable/ru/julia/stdlib/Markdown.html)

2. Встроенный $\LaTeX$ (inline) $\frac{\sqrt{\pi}}{2}$  и отдельной формулой:
```math
\int \limits_{-\infty}^\infty e^{-x^2}\,dx = \sqrt{\pi}
```
## Смотреть также

[`документирование`](https://engee.com/helpcenter/stable/ru/julia/manual/documentation.html
), [`функции`](https://engee.com/helpcenter/stable/ru/julia/manual/functions.html)
"""
function foo()
    return nothing
end
Out[0]:
foo
In [ ]:
@doc foo
Out[0]:

Документация, содержащая:

  1. Markdown:

  2. Встроенный $\LaTeX$ (inline) $\frac{\sqrt{\pi}}{2}$ и отдельной формулой:

$$ \int \limits_{-\infty}^\infty e^{-x^2}\,dx = \sqrt{\pi} $$

Смотреть также

документирование, функции

记录全局变量

使用全局变量时,请注意性能问题使用的适当性

考虑用单个引用记录多个全局变量的情况

In [ ]:
"Ускорение свободного падения"
g_Earth, g_Moon
const g_Earth::Float64 = 9.81
const g_Moon::Float64 = 1.62
Out[0]:
1.62

现在,让我们检查一下两个变量是否同时存在相同的帮助:

In [ ]:
@doc g_Earth
Out[0]:

Ускорение свободного падения

In [ ]:
@doc g_Moon
Out[0]:

Ускорение свободного падения

请注意,const 意味着变量类型的恒定性,而不是变量值的恒定性。

  • 如果类型发生变化,将调用ERROR
  • 当变更为相同类型的值时,将调用警告
In [ ]:
# g_Moon = "Moon"
In [ ]:
println(g_Earth)
g_Earth = 32.
println(g_Earth)
9.81
32.0
WARNING: redefinition of constant Main.g_Earth. This may fail, cause incorrect answers, or produce other errors.

记录结构

假设有一组相同的图形。 问题是如何在平面上以最紧凑的方式排列这些图形。那么结构将包含图形相对于水平面的质量中心旋转角度。 作为 默认构造函数,我们将选择GeomteryShape((x=0,y=0),α=0) 。关于构造函数的更多信息,请参阅文档

In [ ]:
@doc """
GeometricShape((x=X,y=Y),α)

    Геометрическая фигура
- `center_of_mass`: (x=X,y=Y) - кортеж координат центра масс
- `orientation`: α - угол поворота фигуры относительно горизонтали
## Пример:
GeometricShape((x=1., y=2.), 3.)

## Возможные ошибки
1.
```julia-repl
julia> GeometricShape((4.,5.),6.)
ERROR: MethodError: no method matching GeometricShape(::Tuple{Float64, Float64}, ::Float64)

Closest candidates are:
  GeometricShape(::@NamedTuple{x::Float64, y::Float64}, ::Any)
```
**Решение:** в кортеже нужно явно указать имена полей: `GeometricShape((x=4., y=5.), 6.)`
2. 
```julia-repl
julia> GeometricShape((x=1,y=2),3.)
ERROR: MethodError: no method matching GeometricShape(::@NamedTuple{x::Int64, y::Int64}, ::Float64)

Closest candidates are:
  GeometricShape(::@NamedTuple{x::Float64, y::Float64}, ::Any)
```
**Решение:** передавайте в качетсве параметров значения типа `Float64`, а не `Int64`: GeometricShape((x=1.,y=2.),3.)
"""
struct GeometricShape
    center_of_mass::NamedTuple{(:x,:y),Tuple{Float64,Float64}}
    orientation::Float64
    GeometricShape() = new((x=0,y=0),0)  # конструктор по умолчанию
    GeometricShape((X,Y)::NamedTuple{(:x,:y),Tuple{Float64,Float64}},α)=new((x=X,y=Y),α)
end
GeometricShape
In [ ]:
GeometricShape((x=4.,y=5.),6.)
GeometricShape((x = 4.0, y = 5.0), 6.0)
In [ ]:
@doc GeometricShape

GeometricShape((x=X,y=Y),α)

Геометрическая фигура
  • center_of_mass: (x=X,y=Y) - кортеж координат центра масс
  • orientation: α - угол поворота фигуры относительно горизонтали

Пример:

GeometricShape((x=1., y=2.), 3.)

Возможные ошибки

julia> GeometricShape((4.,5.),6.)
ERROR: MethodError: no method matching GeometricShape(::Tuple{Float64, Float64}, ::Float64)

Closest candidates are:
  GeometricShape(::@NamedTuple{x::Float64, y::Float64}, ::Any)

Решение: в кортеже нужно явно указать имена полей: GeometricShape((x=4., y=5.), 6.)

julia> GeometricShape((x=1,y=2),3.)
ERROR: MethodError: no method matching GeometricShape(::@NamedTuple{x::Int64, y::Int64}, ::Float64)

Closest candidates are:
  GeometricShape(::@NamedTuple{x::Float64, y::Float64}, ::Any)

Решение: передавайте в качетсве параметров значения типа Float64, а не Int64: GeometricShape((x=1.,y=2.),3.)

In [ ]:
GeometricShape()
GeometricShape((x = 0.0, y = 0.0), 0.0)
In [ ]:
first_shape = GeometricShape((x=1.,y=2.),3.)
first_shape.center_of_mass.y
2.0

请注意,我们结构中的对象在构造后是不可变的。如果需要使用可变对象,它们必须是 mutable struct 类型。

In [ ]:
# first_shape.orientation = 4. # ОШИБКА: нельзя менять уже созданный объект

记录宏

In [ ]:
"Макрос, здоровающийся с пользователем"
macro hellouser(username)  # создание макроса
println("Hello, $(username)!")
end

@hellouser "Peter"  # применение макроса
Hello, Peter!

要获取宏的帮助,必须先编写@ ,然后输入宏名: @macrosname

In [ ]:
@doc @hellouser
Out[0]:

Макрос, здоровающийся с пользователем

创建和记录模块

在本示例的文件夹中有一个 TemperatureScales.jl 文件。该文件包含模块TemperatureScales

要访问其函数和变量,您需要 1.使用命令cd(path) 进入文件夹,可执行文件 (documentating.ngscript) (@__DIR__) 位于该文件夹。同一路径包含 TemperatureScales.jl

In [ ]:
@__DIR__
Out[0]:
"/user/Engee/Demos/Engee/Documentating"
In [ ]:
cd(@__DIR__)

2.将该模块包含在脚本中: 执行命令include("Filename.jl") 后,julia 会将文件Filename.jl 中的文本 "包含 "到当前脚本中并执行。(请看文件TemperatureScales.jl 的第一行)。这意味着该文件中的对象将成为我们文件中的对象。

In [ ]:
include("TemperatureScales.jl")
Greeting from TemperatureScales.jl!
Out[0]:
Main.TemperatureScales
In [ ]:
println(variable_from_TemperatureScales)
3

但我们的任务是使用该文件中的模块。使用关键字module 创建模块,使用关键字usingimport 使用模块。

In [ ]:
using .TemperatureScales

要了解该模块的具体功能,让我们调用模块帮助:

In [ ]:
@doc TemperatureScales
Out[0]:

Модуль перевода температур. Поддерживает шкалы:

  • Фаренгейта
  • Цельсия

Основные функции:

fahr2cels, cels2fahr,

让我们来了解一下 fahr2cels 功能是如何工作的:

In [ ]:
@doc fahr2cels
Out[0]:
fahr2cels(t_f::Real)

Преобразует число t_f из шкалы Фаренгейта в шкалу Цельсия по формуле

$$ \frac{5}{9}(t_f+32) $$

fahr2cels(t_f::String)

Сначала преобразует строку в число, затем конвертирует.

Extended help

Здесь мы можем указать более подробную документацию

正如您所看到的,fahr2cels 帮助说明了两种方法。第一种方法适用于参数为数字的情况,第二种方法适用于参数为字符串的情况。

现在进入命令提示符并运行

fahr2cels

注意最后一行: 扩展帮助可从?? 获取。

现在退出帮助模式(删除?)

现在输入

??fahr2cels

现在我们有一个扩展的引用 😊😊😊😊。

结论

Engee 中的文档非常灵活(Markdown,$\LaTeX$ ),支持大量的文档对象:函数、变量、结构、宏和模块

我们研究了在脚本中加入自定义模块的问题。