Программное управление скриптами
Смотрите также: Применение программного управления моделью |
Здесь представлены все методы программного управления engee.script
. Для ознакомления с методами 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
. При равномfalse
скрипт выполняется в основном пользовательском окружении (модуль Main). Все переменные, объявленные глобально или на верхнем уровне, сохраняются после выполнения. При равном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
, поэтому переменные из скрипта автоматически ссылаются на значения из области видимости функции.