软件脚本管理
脚本 "方法
#
engee.script.edit
— Function
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
— Function
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
) 将改变变量x
和y
,并将: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
— Macro
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
直接执行,除非定义了变量z
和b
。但可以通过@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
的主体中,因此脚本中的变量会自动引用函数范围中的值。