Программное управление скриптами
Смотрите также: Применение программного управления моделью |
Здесь представлены все методы программного управления engee.script
. Для ознакомления с методами engee
обратитесь к статье Публичные методы программного управления.
Методы Engee.script
#
Engee.Script.edit
— Function
engee.script.edit(path::String)
Открывает блокнот на редактирование. Если указано расширение иное от .ngscript, то выводит ошибку ErrorException("path should end with .ngscript extension")
. Если файла нет, то он создается.
Пример
# Открыть скрипт `file.ngscript` в Редакторе скриптов
engee.Script.edit( "file.ngscript" )
#
Engee.Script.run
— Function
engee.script.run(path::String; isolate::Bool = false)
Запускает скрипт по указанному пути. Возвращает результат последнего верхнеуровневого выражения в скрипте.
Аргументы
-
path::String
: абсолютный путь до скрипта. -
isolate::Bool = false
: (опционально) еслиtrue
, то скрипт выполняется в изолированном окружении. По умолчаниюfalse
. Приisolate = false
скрипт выполняется в основном пользовательском окружении (модуль Main). Все переменные, объявленные глобально или на верхнем уровне, сохраняются после выполнения. Приisolate = 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
(bar(5), bar(15))
# ⇒ ((foo = 11, b = [3, 11, 5]), (foo = 15, b = [3, 11]))
# Скрипт встроен в функцию `foo`, переменные `z` и `b` подставлены автоматически
В коде макрос @include
подставляет код из foo.ngscript
прямо в тело функции foo
, поэтому переменные из скрипта автоматически ссылаются на значения из области видимости функции.