Engee 文档

软件脚本管理

另请参见:程序模型控制的应用

这里介绍了所有 engee.script 程序控制方法。有关 engee 方法的介绍,请参阅文章计划管理的公共方法

脚本 "方法

engee.script.edit(path::String)

在编辑器中打开位于path (包括名称和扩展名)路径下的交互式脚本。如果没有此类文件,则在指定路径下创建一个空脚本文件,并在编辑器中打开。如果path 中指定的扩展名与".ngscript "不同,函数将返回错误信息ErrorException("path should end with '.ngscript' extension")

示例

# Открывает скрипт file.ngscript в Редакторе скриптов Engee
engee.script.edit( "file.ngscript" )
engee.script.run(path::String; isolate::Bool = false)

在指定路径下运行脚本。返回脚本中最后一个顶层表达式的结果。

参数

  • path::String:脚本的绝对路径。

  • isolate::Bool = false:如果等于true ,脚本将在隔离环境中运行。默认值为false 。如果等于false ,脚本将在主用户环境(主模块)中执行。所有在全局或顶层声明的变量在执行后都会保留。等于true 时,脚本在临时隔离环境中运行。脚本终止后,运行时创建的所有变量都不会保存。

示例

考虑带有单个代码单元的文件foo.ngscript

x = 10
y = try
  push!(a, :foo) # Пытаемся добавить :foo в существующий массив `a`
  5        # Если все хорошо — присваиваем y значение 5
catch _
  3        # Если произошла ошибка — присваиваем y значение 3
end
x + y        # Возвращаем сумму x и y

在用户环境中执行 (isolate = false) 将改变变量xy ,并将:foo 添加到数组а 中:

a = Symbol[:bar, :baz] # Исходный массив
x = y = 0        # Переменные до запуска скрипта
(engee.script.run("foo.ngscript"), x, y, a)
# ⇒ (15, 10, 5, [:bar, :baz, :foo])
# Скрипт изменил переменные x и y, а также добавил :foo в массив a

在隔离环境 (isolate = true) 中执行时,脚本不会影响外部变量,也不会保存更改:

# Исходный массив
a = Symbol[:bar, :baz]

# Переменные до запуска скрипта
x = y = 0
(engee.script.run("foo.ngscript"; isolate = true), x, y, a)
# ⇒ (13, 0, 0, [:bar, :baz])
# Скрипт не повлиял на внешние переменные — изменения не сохранились
engee.script.@include(path::String)

在调用宏的位置插入指定脚本的内容。与单独执行脚本的engee.script.run 不同,@include 宏在调用点按词法插入脚本代码。

如果@include 在代码块内(例如在函数内)使用,脚本中未声明为全局的变量将在宏调用所在的词法环境中解释。例如,这样就可以在包含的脚本中使用外部函数中的变量—​脚本将把它们视为当前作用域的局部变量。

参数

path::String:脚本的绝对路径。

示例

考虑带有代码单元格的文件foo.ngscript

if z > 10
  return z
else
  push!(b, z)   # Добавляем значение z в массив b
  return maximum(b)
end

这段代码不能通过engee.script.run 直接执行,除非定义了变量zb 。但可以通过@include 将其嵌入到已经定义了这些变量的函数中:

function foo(z, b)

# `z` и `b` из скрипта будут ссылаться на аргументы этой функции
engee.script.@include "foo.ngscript"
end

function bar(z)
# Исходный массив
b = Int[3, 11]
(foo = foo(z, b), b = b)
end

# Скрипт встроен в функцию `foo`, переменные `z` и `b` подставлены автоматически
(bar(5), bar(15))
# ⇒ ((foo = 11, b = [3, 11, 5]), (foo = 15, b = [3, 11]))

在代码中,宏@include 会将foo.ngscript 中的代码直接替换到函数foo 的主体中,因此脚本中的变量会自动引用函数范围中的值。