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