Документация Engee

Программное управление скриптами

Здесь представлены все методы программного управления engee.script. Для ознакомления с методами engee обратитесь к статье Публичные методы программного управления.

Методы Engee.script

engee.script.edit(path::String)

Открывает блокнот на редактирование. Если указано расширение иное от .ngscript, то выводит ошибку ErrorException("path should end with .ngscript extension"). Если файла нет, то он создается.

Пример

# Открыть скрипт `file.ngscript` в Редакторе скриптов
engee.Script.edit( "file.ngscript" )
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(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, поэтому переменные из скрипта автоматически ссылаются на значения из области видимости функции.